Course overview + the shell

Published:

Shell

Shell 이란?

리눅스의 쉘은 명령어와 프로그램을 실행 할 때 사용하는 인터페이스입니다. 가장 널리 쓰이는 쉘 프로그램은 bash 입니다.

shell_example

좀 더 정확하게는 커널과 사용자의 다리 역할을 합니다

구체적인 예로는 리눅스의 터미널 처럼 명령어를 입력하는 환경이 있습니다.

Shell script 사용

  1. $
(base) khyeon@khyeon-900X5N:~$

Linux terminal 을 보면 $ 를 표시합니다. 이는 root사용자가 아님을 의미 합니다

  1. echo
(base) khyeon@khyeon-900X5N:~$ echo test
test

echo 는 출력함수 입니다. test라는 인자를 받아서 터미널화면에 test를 출력한 결과를 보여줍니다.

  1. 프로그램 연결
  • 입력 스트림과 출력 스트림은 > 파일, < 파일을 이용하여 가능합니다.
(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 를 실행 하게 됩니다.

  1. source

bash의 내부 명령어로 명령어 뒤에 오는 파일을 읽어서 파일 내용 실행하는 역할입니다.

source 또는 .을 사용해도 됨.

ex)

source /etc/profile

. /etc/profile

출처: https://puham.tistory.com/23 [리눅스 SUPERUSER]

  1. 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

  1. touch를 이용해서 semester라는 파일을 만들어 보세요
  2. 아래 주어진 것을 그 파일에 써보세요. 단, 한번에 한줄씩

    #!/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
    
  3. 파일을 실행해보세요. 예를 들어, (./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
```
  1. sh 인터프리터로 시작해 명령을 실행하고, semester 파일에 첫 인자로 주세요. (즉 sh semester 이렇게!). ./semester는 안되는데, 앞에 거는 왜 실행이 될까요?
  2. chmod 프로그램을 살펴보세요. (man chmod를 사용해보세요.)
  3. 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
    
  4. | 와 >를 사용해 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
    
  5. 노트북 배터리의 전원 레벨 또는 데스크탑 컴퓨터의 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

#