몇 달 전 페이스북에서 우연히 "Missing Semster of Your CS Education"이라는 아래의 사이트를 알게 되었다. MIT에서 가르치는 정식 커리큘럼에다가 CS 교과과정에서 다루진 않지만 중요한 걸 가르쳐 준다는 취지에 혹해서 들어가보았고, 꽤나 매력적인 개념들을 가르쳐주길래 '언젠가 꼭 들어야지'라고 막연히 생각만 하고 있었다.
그후 CS 학부 과정을 들으면서 리눅스에 대해 더 관심을 가지게 되기도 하고, SW 사관학교 정글에 와서 본격적으로 웹서버 혹은 운영체제 같이 '대개의 응용 프로그램 보다는 low-level'스러운 걸 만드려고 하다보니 터미널을 잘 다뤄야겠다는 생각이 들면서 지금이 저걸 들어야 할 타이밍이겠구나 라는 생각이 들어 바로 공부를 시작했다.
링크 : 여러분의 CS 교육에서 누락된 학기
코스는 2주 정도 되는 분량이다. 총 11개의 비디오로 이루어져있다.
1주차 부터 순서대로,
조금은 아는 Shell 부터 처음 들어보는 Metaprogramming 까지 다양한 개념들이 많다. 각 주차마다 연습문제도 있어서 개념 공부를 다잡기도 좋다. 첫 주차부터 차근차근 들어보면서 다른 사람들도 알면 좋을 개념 혹은 문제들을 간간히 올려보려고 한다.
Shell에 대해 배움.(한글로는 '셸')
Command Line Interface로 명령을 수행.
기본적으로 파이썬이나 자바같은 프로그래밍 환경이고, 변수, 조건문, 반복문 등을 사용해서 코딩할 수 있다.
어떤 명령은 기본적으로 프로그램을 실행하는 것이다. 셸이 그 프로그램을 발견해서 실행 가능하다면 실행하는데, 실행 권한이 없으면 오류가 날 수 있다. 대개의 프로그램은 환경변수에 등록이 되어있어 실행가능하다.
Python을 터미널에서 실행할 때 python3 [app.py](http://app.py)
라고 입력하는 이유도 환경변수에 python3가 등록되어있기 때문에 가능하다. (물론 프로그램의 Full path를 입력하면 등록없이 가능 하다.)
대부분의 유닉스 계열 시스템(Linux, Mac os 등)에는 Root 사용자라는 개념이 존재한다. 관리자 권한이라고 보면 된다. 이런 관리자 권한을 일반 사용자 레벨에서도 실행할 수 있는 명령어가 sudo
이다.(Super User Do)
/tmp
에 missing
이라는 새로운 경로를 만들어 보세요.
mkdir
같은 명령어로 디렉토리를 만들 수 있다. 디렉토리 = 폴더라고 생각하면 된다.touch
라는 프로그램을 관찰해보세요. man
프로그램이 도움이 될겁니다.
man touch
라고 입력하면 touch에 대한 설명이 쭈루룩 나온다.touch
는 파일의 접근이나 타임스탬ㅍ를 변경하는데 사용되는 프로그램이다. 보통 새 파일을 만들 때 사용된다.touch
를 이용해서 semester
라는 파일을 missing
안에 만들어 보세요.
touch semester
라고 입력하면 된다.아래 주어진 것을 그 파일에 써보세요. 단, 한번에 한줄씩.
#!/bin/sh curl --head --silent https://missing.csail.mit.edu
첫번째 줄을 작동시키는게 꽤 까다로울 것입니다. #
으로 시작하는 것은 코멘트(comment)고, !
는 큰 따옴표("
)로 둘러쌓인 문자열 내에서도 특별한 의미를 가집니다. 배시(Bash)는 작은 따옴표'
문자열과 큰따옴표를 구분합니다. 이것은 매우 헷갈리는 케이스입니다. Bash 인용 관련 메뉴얼 페이지에 더 자세한 정보가 설명돼있습니다.
#!/bin/sh
라는 코드는 웬만한 셸 스크립트의 첫번째 줄에 적힌 코드이다. /bin/sh
를 확인해보면 다음과 같다.
-> dash
라고 해놓는지? 에 대한 이유를 잘 설명해놓은 글이 있다. 요약하면, 리눅스 배포판에서는 bash 셸을 오랜 기간 디폴트로 써오고 있다. 그러나 데비안/우분투 쪽에서 특정 버전부터 bash 셸이 더 가볍다는 이유로 bash를 dash 셸로 교환했다고 한다.#!/bin/sh
는 셸 스크립트를 동작하기 위해 선언하는 코드라고 볼 수 있다.참고 : [Ubuntu/Linux] #!/bin/sh에 대한 간단한 이야기
What is the difference between #!/bin/sh and #!/bin/bash?
curl
은 command line용 data transfer tool.--head
는 header만 보여주는 아규먼트. --silent
는 response code만 가져올 때 보통 쓰는듯.파일을 실행해보세요. 예를 들어, (./semester
)라는 경로를 셸에 입력해보세요. 이것이 왜 작동하지 않는지 ls
를 이용해 파악해보세요. (힌트: 파일의 비트 권한을 확인해보세요.)
x
가 실행 권한인데 존재하지 않음.sh
인터프리터로 시작해 명령을 실행하고, semester
파일을 첫 인자로 주세요. (즉 sh semester
이렇게!). ./semester
는 안되는데, 앞에 거는 왜 실행이 될까요?
chmod
프로그램을 살펴보세요. (man chmod
를 사용해보세요.)
chmod
a+x
~~.py
는 aqll users에게 executable 한 권한을 주어라. 라는 뜻이었다.참고 : What is the difference between "chmod +x" and "chmod 755"?
**chmod
를 활용해 sh semester
대신에 ./semester
을 사용 가능하게 해보세요. sh
을 이용해 이 파일을 해석해야 한다는 것을 셸이 어떻게 알까요? 이 페이지에서 셔뱅(shebang)에 대해서 더 알아보세요.**
chmod 755 ./semester
라고 할 수 있다.#!/bin/sh
라고 우리가 선언해놓았기 때문에(셔뱅 사용) 스크립트가 이 셸 문법이구나 라고 인식할 수 있게 된다.|
와 >
를 사용해 semester
별 “last modified” 날짜 출력을 홈 디렉토리에 last-modified.txt
라는 파일에 작성하세요.
ls -l / | tail -n1 > last-modified.txt
stat -c '%y' semester | tail -n1 >> last-modified.txt
노트북 배터리의 전원 레벨 또는 데스크탑 컴퓨터의 CPU 온도를 /sys
에서 읽는 명령을 작성하십시오. 참고: 만약 macOS 사용자라면, 당신의 OS는 sysfs가 없기 때문에, 이 예제를 건너뛸 수 있습니다.