Course overview + the shell
Published:
Shell
Shell 이란?
리눅스의 쉘은 명령어와 프로그램을 실행 할 때 사용하는 인터페이스입니다. 가장 널리 쓰이는 쉘 프로그램은 bash 입니다.
좀 더 정확하게는 커널과 사용자의 다리 역할을 합니다
구체적인 예로는 리눅스의 터미널 처럼 명령어를 입력하는 환경이 있습니다.
Shell script 사용
- $
(base) khyeon@khyeon-900X5N:~$
Linux terminal 을 보면 $
를 표시합니다. 이는 root사용자가 아님을 의미 합니다
- echo
(base) khyeon@khyeon-900X5N:~$ echo test
test
echo
는 출력함수 입니다. test라는 인자를 받아서 터미널화면에 test를 출력한 결과를 보여줍니다.
- 프로그램 연결
- 입력 스트림과 출력 스트림은
>
파일,<
파일을 이용하여 가능합니다.
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ echo hello
hello
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ echo hello > hello.txt
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ cat hello.txt
hello
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ cat < hello.txt
hello
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ cat < hello.txt > hello2.txt
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ cat hello2.txt
hello
>>
을 이용할 경우, append 개념으로 파일의 뒤에 추가할 수 있습니다
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ echo everyone >> hello2.txt
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ cat hello2.txt
hello
everyone
- 응용
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ echo "source /opt/ros/kinetic/setup.bash" >> ~/.bashrc
~/.bashrc 는 bash가 수행 될 때 실행 되는 함수를 제어하는 지역적인 시스템 설정과 관련된 파일입니다. 위 커맨드를 실행 할 경우, bashrc 파일에 source /opt/ros/kinetic/setup.bash
을 append하게 되므로 새 커맨드가 열릴 때마다 source /opt/ros/kinetic/setup.bash
를 실행 하게 됩니다.
- source
bash의 내부 명령어로 명령어 뒤에 오는 파일을 읽어서 파일 내용 실행하는 역할입니다.
source 또는 .을 사용해도 됨.
ex)
source /etc/profile
. /etc/profile
출처: https://puham.tistory.com/23 [리눅스 SUPERUSER]
- touch
touch 는 파일의 시간을 현재 시간으로 바꿔주게 됩니다. 만약 파일이 없을 경우, 빈 파일을 만들어 줍니다.
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ ls -l
total 8
-rw-rw-r-- 1 khyeon khyeon 15 11월 8 16:57 hello2.txt
-rw-rw-r-- 1 khyeon khyeon 6 11월 8 16:53 hello.txt
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ touch hello2.txt
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ ls -l
total 8
-rw-rw-r-- 1 khyeon khyeon 15 11월 8 17:28 hello2.txt
-rw-rw-r-- 1 khyeon khyeon 6 11월 8 16:53 hello.txt
Exercise
touch
를 이용해서semester
라는 파일을 만들어 보세요아래 주어진 것을 그 파일에 써보세요. 단, 한번에 한줄씩
#!/bin/sh curl --head --silent https://missing.csail.mit.edu
첫번째 줄을 작동시키는게 꽤 까다로울 것입니다.
#
으로 시작하는 것은 코멘트(comment)고,!
는 큰 따옴표("
)로 둘러쌓인 문자열 내에서도 특별한 의미를 가집니다. 배시(Bash)는 작은 따옴표'
문자열과 큰따옴표를 구분합니다. 이것은 매우 헷갈리는 케이스입니다. Bash 인용 관련 메뉴얼 페이지에 더 자세한 정보가 설명돼있습니다. ans)(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ echo '#!/bin/sh' > semester(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ cat semsester cat: semsester: No such file or directory (base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ cat semester #!/bin/sh (base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ echo curl --head --silent https://missing.csail.mit.edu >> semester (base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ cat semester #!/bin/sh curl --head --silent https://missing.csail.mit.edu
- 파일을 실행해보세요. 예를 들어, (
./semester
)라는 경로를 셸에 입력해보세요. 이것이 왜 작동하지 않는지ls
를 이용해 파악해보세요. (힌트: 파일의 비트 권한을 확인해보세요.)
ans) touch 통해 semester를 만들어도, 실행 권한이 없기 때문에 실행하지 못함 -rw-rw-r—
```bash
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ ls
hello2.txt hello.txt semester
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ ./semester
bash: ./semester: Permission denied
(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ ls -l
total 8
-rw-rw-r-- 1 khyeon khyeon 15 11월 8 17:28 hello2.txt
-rw-rw-r-- 1 khyeon khyeon 6 11월 8 16:53 hello.txt
-rw-rw-r-- 1 khyeon khyeon 0 11월 8 22:30 semester
```
sh
인터프리터로 시작해 명령을 실행하고,semester
파일에 첫 인자로 주세요. (즉sh semester
이렇게!)../semester
는 안되는데, 앞에 거는 왜 실행이 될까요?chmod
프로그램을 살펴보세요. (man chmod
를 사용해보세요.)chmod
를 활용해sh semester
대신에./semester
을 사용 가능하게 해보세요.sh
을 이용해 이 파일을 해석해야 한다는 것을 셸이 어떻게 알까요? 이 페이지에서 셔뱅(shebang)에 대해서 더 알아보세요. ans)(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ sh semester HTTP/1.1 200 OK Connection: keep-alive Content-Length: 7806 Server: GitHub.com Content-Type: text/html; charset=utf-8 Last-Modified: Fri, 30 Oct 2020 08:24:31 GMT ETag: "5f9bcdbf-1e7e" Access-Control-Allow-Origin: * Expires: Sun, 08 Nov 2020 13:41:49 GMT Cache-Control: max-age=600 X-Proxy-Cache: MISS X-GitHub-Request-Id: 6E84:6AA1:EDEDA9:107CEF2:5FA7F345 Accept-Ranges: bytes Date: Sun, 08 Nov 2020 14:09:10 GMT Via: 1.1 varnish Age: 0 X-Served-By: cache-hkg17932-HKG X-Cache: MISS X-Cache-Hits: 0 X-Timer: S1604844550.958312,VS0,VE162 Vary: Accept-Encoding X-Fastly-Request-ID: 46b0a5cdd1afd005b6d8501384740ac39f2c3fb6 (base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ chmod +x semester (base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ ./semester HTTP/1.1 200 OK Connection: keep-alive Content-Length: 7806 Server: GitHub.com Content-Type: text/html; charset=utf-8 Last-Modified: Fri, 30 Oct 2020 08:24:31 GMT ETag: "5f9bcdbf-1e7e" Access-Control-Allow-Origin: * Expires: Sun, 08 Nov 2020 13:41:49 GMT Cache-Control: max-age=600 X-Proxy-Cache: MISS X-GitHub-Request-Id: 6E84:6AA1:EDEDA9:107CEF2:5FA7F345 Accept-Ranges: bytes Date: Sun, 08 Nov 2020 14:09:30 GMT Via: 1.1 varnish Age: 20 X-Served-By: cache-hkg17930-HKG X-Cache: HIT X-Cache-Hits: 1 X-Timer: S1604844570.223058,VS0,VE1 Vary: Accept-Encoding X-Fastly-Request-ID: bfa811f8bee9799f326e614df96e2ba8d865a3c5
|
와>
를 사용해semester
별 “last modified” 날짜 출력을 홈 디렉토리에last-modified.txt
라는 파일에 작성하세요. ans)(base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ ./semester | grep Las Last-Modified: Fri, 30 Oct 2020 08:24:31 GMT (base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ ./semester | grep Las > ~/last-modified.txt (base) khyeon@khyeon-900X5N:~/workspace/missing-CS-semester/shell$ cat ~/last-modified.txt Last-Modified: Fri, 30 Oct 2020 08:24:31 GMT
노트북 배터리의 전원 레벨 또는 데스크탑 컴퓨터의 CPU 온도를
/sys
에서 읽는 명령을 작성하십시오. 참고: 만약 macOS 사용자라면, 당신의 OS는 sysfs가 없기 때문에, 이 예제를 건너뛸 수 있습니다.(base) khyeon@khyeon-900X5N:/sys/class/power_supply/BAT1$ cat capacity 100
Reference
https://missing-semester-kr.github.io/2020/course-shell/
https://jhnyang.tistory.com/57
#