Missing Semester: Shell Basic

Author

Heeyoung Kim

Published

December 8, 2022

아래 노트북은 MIT에서 제공하는 Missing semester의 연습문제를 풀이한 것입니다. 이번 내용은 셸(Shell) 에 대한 것입니다.

1. /tmp에 missing이라는 새로운 경로를 만들어 보세요 .

%cd /tmp
/private/tmp

!cd가 작동하지 않기 때문에, %cd로 대체하여 사용했습니다.

!pwd
/private/tmp
!mkdir missing

2. touch라는 프로그램을 관찰해보세요. man 프로그램이 도움이 될겁니다.

!man touch

touch 명령어는 파일이 없을 때 새로운 파일을 만들 수 있는 명령어입니다.

3. touch를 이용해서 semester라는 파일을 missing 안에 만들어 보세요.

%cd missing
/private/tmp/missing
!touch semester
!ls
echo     semester

4. 아래 주어진 것을 그 파일에 써보세요. 단, 한번에 한줄씩

#!/bin/sh
curl –head –silent https://missing.csail.mit.edu

!echo '#!/bin/sh\n' > semester >> echo 'curl --head --silent https://missing.csail.mit.edu'
!cat semester
#!/bin/sh
 curl --head --silent https://missing.csail.mit.edu

#, ! 등은 shell 내에서 특수한 역할을 하는 문자로, 해당 기능으로 사용하는 것이 아닌 문자로 취급하도록 컴퓨터에 알려 주어야 합니다. 위에서는 작은 따옴표(’)를 활용하여 문장을 감쌉니다.

줄구분은 특수문자인 \n을 사용했으나, 다른 방법이 있는지 확인해 봐야겠습니다.

5. 파일을 실행해보세요. 예를 들어, (./semester)라는 경로를 셸에 입력해보세요. 이것이 왜 작동하지 않는지 ls를 이용해 파악해보세요. (힌트: 파일의 비트 권한을 확인해보세요.)

!./semester
zsh:1: permission denied: ./semester

Permission denied - 권한이 거부되었습니다. 해당 파일의 권한을 확인하겠습니다.

!ls -l
total 8
-rw-r--r--  1 hyk  wheel  62 Dec  8 16:54 semester

첫 문자는 해당 객체가 디렉토리인지 아닌지를 의미합니다. 디렉토리인 경우 첫 문자는 d입니다. 이 객체는 디렉토리가 아닙니다.

r은 읽기 권한, w은 쓰기 권한을 나타냅니다. 위에서는 보이지 않으나 x는 실행 권한을 의미합니다.

세 문자씩 끊어서 파일 소유자의 권한, 소유 그룹의 권한, 다른 모든 사람들의 권한을 의미합니다. ./semester 명령에도 작동하지 않는 이유는 파일 소유자, 소유 그룹, 다른 모든 사람들 중 실행 권한 x를 가진 사람이 없기 때문입니다.

6. sh 인터프리터로 시작해 명령을 실행하고, semester 파일에 첫 인자로 주세요. (즉 sh semester 이렇게!). ./semester는 안되는데, 앞에 거는 왜 실행이 될까요?

!sh semester
HTTP/2 200 
server: GitHub.com
content-type: text/html; charset=utf-8
last-modified: Mon, 05 Dec 2022 15:59:23 GMT
access-control-allow-origin: *
etag: "638e155b-1f37"
expires: Mon, 05 Dec 2022 17:56:30 GMT
cache-control: max-age=600
x-proxy-cache: MISS
x-github-request-id: 3D04:7A94:4B80:17691:638E2E76
accept-ranges: bytes
date: Thu, 08 Dec 2022 08:07:09 GMT
via: 1.1 varnish
age: 0
x-served-by: cache-nrt-rjtf7700062-NRT
x-cache: HIT
x-cache-hits: 1
x-timer: S1670486829.366512,VS0,VE226
vary: Accept-Encoding
x-fastly-request-id: 4c44fa880a52315bef95222f27f437345312a5ee
content-length: 7991

모든 사용자가 읽기 권한 r은 가지고 있기 때문에 해당 프로그램을 실행할 수는 있습니다. ./semester 명령은 해당 폴더에 접속 권한 x가 있어야 하기 때문에 실행되지 않았습니다.

7. chmod 프로그램을 살펴보세요. (man chmod를 사용해보세요.)

!man chmod

chmod는 파일의 권한을 수정하는 명령어입니다. 숫자 또는 예약어를 통해 소유자, 소유 그룹, 다른 모든 사람들의 읽기, 쓰기, 실행 권한을 수정할 수 있습니다.

8. chmod를 활용해 sh semester 대신에 ./semester을 사용 가능하게 해보세요. sh을 이용해 이 파일을 해석해야 한다는 것을 셸이 어떻게 알까요? 이 페이지에서 셔뱅(shebang)에 대해서 더 알아보세요.

!chmod u=rwx,go=rx semester
!ls -l
total 8
-rwxr-xr-x  1 hyk  wheel  62 Dec  8 16:54 semester

위와 같이 권한이 -rw-r--r--에서 -rwxr-xr-x로 수정되었음을 알 수 있습니다. 모든 사용자가 실행 권한을 가지고 있기 때문에, ./semester을 통한 접속도 가능할 것입니다.

!./semester
HTTP/2 200 
server: GitHub.com
content-type: text/html; charset=utf-8
last-modified: Mon, 05 Dec 2022 15:59:23 GMT
access-control-allow-origin: *
etag: "638e155b-1f37"
expires: Mon, 05 Dec 2022 17:56:30 GMT
cache-control: max-age=600
x-proxy-cache: MISS
x-github-request-id: 3D04:7A94:4B80:17691:638E2E76
accept-ranges: bytes
date: Thu, 08 Dec 2022 08:27:23 GMT
via: 1.1 varnish
age: 0
x-served-by: cache-nrt-rjtf7700029-NRT
x-cache: HIT
x-cache-hits: 1
x-timer: S1670488044.617282,VS0,VE220
vary: Accept-Encoding
x-fastly-request-id: 7da9cf240d64e552531be45064755f40dc65c6bd
content-length: 7991

좋습니다!

9. | 와 >를 사용해 semester별 “last modified” 날짜 출력을 홈 디렉토리에 last-modified.txt라는 파일에 작성하세요.

grep은 문자가 존재하는 라인을 추출합니다.

!sh semester | grep --ignore-case 'last-modified'
last-modified: Mon, 05 Dec 2022 15:59:23 GMT

MacOS에서 cut 명령어를 사용할 때는 자를 기준점을 지정해 주어야 합니다. byte, 문자, 구두점 중 선택 가능합니다. 구두점의 경우 -f 옵션을 지정하고 -d 옵션 뒤에 구두점을 적습니다.

!sh semester | grep --ignore-case 'last-modified' | cut -d : -f 2
 Mon, 05 Dec 2022 15

아래와 같이 >를 사용하여 저장합니다. home 디렉토리는 ~로 접근합니다.

!sh semester | grep --ignore-case 'last-modified' | cut -d : -f 2 > ~/last-modified.txt
!cat ~/last-modified.txt
 Mon, 05 Dec 2022 15