여러분의 CS 교육에서 누락된 학기 - 셸 연습문제

Hyuno Choi·2021년 7월 4일
0
post-thumbnail

이 포스팅은 MIT 공개 강의를 바탕으로 작성되었습니다. https://missing.csail.mit.edu/


2021년 7월 4일

지난번 셸 포스팅에 이어 강의에서 제공하는 연습문제를 풀어보는 시간을 갖도록 하겠습니다. 연습문제 풀이 환경은 지난번과 동일합니다.

  • Shell: zsh
  • Terminal: iTerm
  • OS: MacOs

1번 문제

/tmpmissing이라는 새로운 경로를 만들어 보세요.

새로운 디렉토리 생성은 mkdir 명령어를 사용합니다.

hyunochoi in /tmp  > mkdir missing

2번 문제

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

hyunochoi in /tmp  > man touch
DESCRIPTION
     The touch utility sets the modification and access times of files.  If
     any file does not exist, it is created with default permissions.

     By default, touch changes both modification and access times.  The -a and
     -m flags may be used to select the access time or the modification time
     individually.  Selecting both is equivalent to the default.  By default,
     the timestamps are set to the current time.  The -t flag explicitly spec-
     ifies a different time, and the -r flag specifies to set the times those
     of the specified file.  The -A flag adjusts the values by a specified
     amount.

man 프로그램은 인자로 받은 다른 프로그램의 정보를 출력해줍니다.

touch 프로그램은 기본적으로 새로운 파일을 만들기 위해 사용하는 프로그램입니다. touch 파일명 명령어로 새 파일을 현재 디렉토리 안에 생성합니다.

3번 문제

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

2번 문제에서 살펴본 touch 프로그램으로 새 파일인 semester를 생성합니다.

hyunochoi in /tmp/missing  > touch semester

4번 문제

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

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

vi 편집기semester 파일에 해당 스크립트를 적어보겠습니다. vi semester 명령어로 파일을 열어줍니다.

편집기로 새 파일을 열면 아무것도 적혀있지 않은 편집기 창이 보입니다. 편집기를 열면 명령 모드 상태로 열리기 때문에 텍스트를 적을 수 없습니다. i를 눌러 입력 모드로 전환합니다.

입력 모드 상태에서는 편집기 창 좌측 하단에 -- INSERT --라는 글자가 보입니다.

첫 줄을 입력하고 나서 esc를 눌러 다시 명령 모드로 돌아옵니다. 그리고 :wq를 순서대로 눌러 저장 후 종료합니다.

두 번째 줄도 같은 방법으로 입력합니다.

5번 문제

파일을 실행해보세요. 예를 들어, ./semester라는 경로를 셸에 입력해보세요. 이것이 왜 작동하지 않는지 ls를 이용해 파악해보세요.

hyunochoi in /tmp/missing  > ./semester
zsh: permission denied: ./semester

./semester 명령어를 입력한 결과, 권한 거부 메시지가 출력됩니다. semester 파일의 권한을 확인하기 위해 ls -l 명령어를 입력합니다.

hyunochoi in /tmp/missing  > ls -l
total 8
-rw-r--r--  1 hyunochoi  wheel  61  6 30 01:42 semester

ls -l 명령어로 파일 권한을 확인한 결과, 실행 권한이 빠져있습니다(rw-).

6번 문제

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

hyunochoi in /tmp/missing  > sh semester
HTTP/2 200
server: GitHub.com
content-type: text/html; charset=utf-8
last-modified: Sat, 26 Jun 2021 10:14:39 GMT
access-control-allow-origin: *
(생략)

sh semester 명령어는 sh 셸을 실행할 때 semester라는 파일을 인자로 준다는 뜻입니다. 즉, 해당 명령어를 통해 실행하고자하는 것은 sh 셸입니다. 저에게는 sh 셸의 실행 권한이 있으므로 이 명령은 정상적으로 실행됩니다.

반면, ./semester 명령어는 semester라는 프로그램을 직접 실행한다는 뜻입니다. 이 경우, 저에게 semester 파일의 실행 권한이 없기 때문에 권한 거부 메시지가 출력됩니다.

7번 문제

chmod 프로그램을 살펴보세요.

chmod를 사용하면 파일 권한을 수정할 수 있습니다. 사용 예시는 다음과 같습니다.

chmod u+r test.txt

이 명령어의 의미는 Owner user(u)에게 test.txt 파일의 읽기(r) 권한을 추가(+)한다는 뜻입니다.

명령어에서 각각의 위치에 들어가는 대상, 연산자, 권한 리스트는 다음과 같습니다.

대상:

  • u : Owner user
  • g : Group
  • o : Other
  • a : 모든 대상에게 적용

연산자:

  • + : 권한을 추가함
  • - : 권한을 제거함
  • = : 권한을 새로 세팅함

권한:

  • r : 읽기
  • w : 쓰기
  • x : 실행

또한 ,로 여러 대상을 나열하여 동시에 권한을 변경할 수 있습니다.

chmod o+r, g-x test.txt

chmod에 대한 더 자세한 사용법은 이 링크를 참조해주세요. https://www.howtogeek.com/437958/how-to-use-the-chmod-command-on-linux/

8번 문제

chmod를 활용해 sh semester 대신에 ./semester을 사용 가능하게 해보세요. sh을 이용해 이 파일을 해석해야 한다는 것을 셸이 어떻게 알까요?

실행 권한 부여하기

앞에서 살펴본 chmod를 사용하여 semester를 실행 가능하게 만들어보겠습니다. 대상이 되는 사용자는 Owner user이며, 얻어야 하는 권한은 실행 권한인 x입니다.

hyunochoi in /tmp/missing  > chmod u+x semester

chmod를 사용해서 Owner user에게 실행 권한을 부여했습니다. 이제 semester 파일을 단독으로 실행할 수 있습니다.

hyunochoi in /tmp/missing  > ./semester
HTTP/2 200
server: GitHub.com
content-type: text/html; charset=utf-8
last-modified: Sat, 26 Jun 2021 10:14:39 GMT
access-control-allow-origin: *
(생략)

shebang

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

4번 문제에서 semester 파일에 적은 스크립트 내용입니다. 여기서 #!로 시작하는 첫 줄은 이 프로그램을 실행할 인터프리터를 지정해주는 역할을 합니다. 이것을 shebang 혹은 hashbang이라고 부릅니다.

semester를 실행할 인터프리터로 /bin/sh을 지정해주었습니다. 이 자리에는 bin/bash 같은 다른 인터프리터 경로를 넣을 수 있습니다.

프로그램 로더는 shebang을 보고 해당 인터프리터를 실행합니다. 그리고 스크립트를 인터프리터에 입력 데이터로 전달합니다.

대부분의 인터프리터에서 #는 주석이기 때문에 실행 시 shebang은 무시되고, #가 주석으로 쓰이지 않아도 shebang은 인터프리터에서 일반적으로 무시됩니다.

9번 문제

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

어떤 파일을 마지막으로 수정한 날짜는date 프로그램에 -r 옵션과 함께 파일명을 인자로 주면 볼 수 있습니다.

hyunochoi in /tmp/missing  > date -r semester
2021년 7월  4일 일요일 17시 45분 25초 KST

이제 위 명령어의 출력 스트림을 터미널에서 외부 파일로 바꿔보겠습니다. 방금 전의 명령어 뒤에 >와 함께 파일명을 적어주면 됩니다.

hyunochoi in /tmp/missing  > date -r semester > ~/last_modified.txt
hyunochoi in /tmp/missing  > cat ~/last_modified.txt
2021년 6월 30일 수요일 01시 42분 52초 KST

semester의 마지막 수정 날짜가 홈 디렉토리에 있는 last_modified.txt 파일 안에 저장되었습니다.

실습을 수행하는 OS가 리눅스가 아닌 관계로 시스템 파일을 건드리는 실습은 진행하지 않았습니다. 다음 포스팅에서 챕터 2 강의 내용을 이어서 정리하도록 하겠습니다.

<참고한 사이트>

profile
프론트엔드 웹 개발자를 목표로 하고 있습니다.

0개의 댓글