Lecture1 The Shell

Park Choong Ho·2021년 4월 6일
0

Missing Semester

목록 보기
1/2

The Shell

쉘은 무엇인가?

쉘은 컴퓨터가 제공하는 텍스트 기반 인터페이스입니다. Visual 인터페이스는 사용 방식에 제약을 받는데 반해(특정 버튼이나 슬라이더를 누르게끔 강제하는 경우 등등) 쉘은 그런 제약이 상대적으로 덜한 인터페이스입니다. 이것이 바로 쉘이 아직까지 사랑받는 이유입니다. 쉘은 대부분 시스템 os들이 제공하는 인터페이스입니다. 쉘의 종류는 여러가지가 있습니다. (bash, powershell, 등등) 그중에 우리는 bash(born again shell)을 기반으로 공부해 보겠습니다.

date

choonghopark@ChoongHoui-MacBookPro ~       
❯❯❯ date
Wed Mar 31 23:37:29 KST 2021

시스템상에서의 현재 시간을 나타내는 명령어

argument(echo)

argument를 추가하면 특정 프로그램 동작을 변경할 수 있습니다. echo 함수는 아래 예시와 같이 입력한 argument를 단순히 print 해주는 프로그램입니다.

choonghopark@ChoongHoui-MacBookPro ~       
❯❯❯ echo hello
hello

argument는 기본적으로 whitespace(빈칸)로 구분 됩니다.

choonghopark@ChoongHoui-MacBookPro ~                                                                           ✔  35s
❯❯❯ echo "Hello World"
Hello World
choonghopark@ChoongHoui-MacBookPro ~                                                                               ✔
❯❯❯ echo Hello\ World
Hello World

어떻게 shell은 프로그램을 구분할까?

지금까지 우리가 실행한 echo, date같은 프로그램들은 시스템에서 기본적으로 제공하는 프로그램들입니다. 그렇다면 shell은 어떻게 해당 프로그램들이 있는 것을 알고 실행시킬 수 있었던 걸까요? 시스템에서 제공하는 프로그램들은 파일시스템에 저장되어있습니다. 즉, 특정 폴더에 저장되어있는 것이죠. 그리고 쉘에는 자신이 실행할 프로그램들을 저장해놓은 path가 존재합니다.

choonghopark@ChoongHoui-MacBookPro ~                                                                               ✔
❯❯❯ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Users/choonghopark/.local/bin:/usr/local/sbin:/Users/choonghopark/.dotfiles/bin:/Users/choonghopark/.fzf/bin:/Users/choonghopark/.go/bin:/Users/choonghopark/.go/packages/bin

여기서 $PATH라는 환경변수를 사용했습니다. 환경변수란 특정 언어를 가지고 프로그래밍하는데 사용하는 변수입니다. 사실 쉘은 프로그래밍 언어입니다. 쉘에서 프로그램 실행 뿐 아니라, whil문 for문 등 여러가지를 수행할 수 있습니다. 위 결과를 다시 한번 보도록 하죠.

쉘창에 떠있는 긴 결과값은 :을 기준으로 각각 쉘이 우선적으로 찾는 path입니다.(/usr/local/bin, /usr/bin) 예를 들어, echo hello 라고 쳤으면 쉘은 echo라는 프로그램이 저기 나열한 path에 있는지 확인합니다. 프로그램이 path상에 존재하면 프로그램을 실행할 것이고 없으면 실행하지 않습니다. 실행한 프로그램 path를 알고 싶으면 which 명령어를 통해서 확인할 수 있습니다.

choonghopark@ChoongHoui-MacBookPro ~                                                                               ✔
❯❯❯ which python3
/usr/local/bin/python3

python3를 실행하면 사실 컴퓨터는 /usr/local/bin에 위치한 python3 프로그램을 실행하는 것입니다. 아까 path라는 개념을 간단하게만 이야기하고 넘어갔는데 path는 컴퓨터상에서 파일 위치를 의미합니다. Unix 기반 시스템(Linux, MacOS)에서는 path를 /를 기준으로 구분합니다. path가 /로 시작하면 가장 근원(root)부터 시작하는 것입니다. Unix 기반 시스템에서 파일들은 모두 이 root안에 포함되어 있으므로 /로 시작하는 path 표기법를 absolute path라고 합니다. Absolute path는 path 하나로 특정 파일 또는 폴더 하나만 지정합니다. 반대로 relative path는 현재 내가 어디에 위치해 있냐에 따라 가리키는 대상이 달라집니다.

choonghopark@ChoongHoui-MacBookPro ~                                                                               ✔
❯❯❯ pwd
/Users/choonghopark

pwd(print working directory)는 현재 내가 위치한 directory가 어디인지 알려주는 명령어입니다.

choonghopark@ChoongHoui-MacBookPro ~                                                                               ✔
❯❯❯ cd /home

choonghopark@ChoongHoui-MacBookPro  /home                                                                         ✔
❯❯❯

cd(change directory)는 내 위치를 변경하는 명령어입니다.

choonghopark@ChoongHoui-MacBookPro  /home                                                                         ✔
❯❯❯ pwd
/home

현재 내가 위치한 directory가 /home으로 변경된것을 확인할 수 있습니다.

. & ..

., .. 은 다소 특별한 폴더입니다. .은 현재 내가 위치한 폴더이며 ..은 내 부모 폴더, 즉 상위 폴더를 의미합니다.

choonghopark@ChoongHoui-MacBookPro  /home                                                                         ✔
❯❯❯ cd ..

choonghopark@ChoongHoui-MacBookPro  /                                                                             ✔
❯❯❯

cd ..을 통해 내 위치를 /home에서 /로 변경한 것을 확인할 수 있습니다. 이번에는 .을 활용해 다시 /home 디렉토리로 이동해보겠습니다.

choonghopark@ChoongHoui-MacBookPro  /                                                                             ✔
❯❯❯ cd ./home

choonghopark@ChoongHoui-MacBookPro  /home                                                                         ✔
❯❯❯

ls

ls 명령어는 내가 현재 위치한 directory에 위차한 폴더와 파일을 보여주는 명령어입니다.

choonghopark@ChoongHoui-MacBookPro ~                                                                               ✔
❯❯❯ ls
Applications    Downloads       Library         Pictures        Public          dump.rdb
Desktop         Dropbox         Movies          Postman         VirtualBox VMs  getting-started
Documents       IdeaProjects    Music           Postman Agent   data            temp

argument로 path를 줄 수 있습니다. 그러면 해당 path에 존재하는 파일 및 폴더를 보여줍니다.

choonghopark@ChoongHoui-MacBookPro ~                                                                               ✔
❯❯❯ ls ..
Shared       choonghopark

cd ~ 를 활용하면 home directory로 이동합니다.

choonghopark@ChoongHoui-MacBookPro  /                                                                             ✔
❯❯❯ cd ~

choonghopark@ChoongHoui-MacBookPro ~                                                                               ✔
❯❯❯

cd - 명령어는 내가 바로전에 있었던 위치로 돌아가게해줍니다.

choonghopark@ChoongHoui-MacBookPro ~                                                                               ✔
❯❯❯ cd ./Desktop/Programming/csapp

choonghopark@ChoongHoui-MacBookPro ~/Desktop/Programming/csapp   main ✱ 3 ?7                                      ✔
❯❯❯ cd -
~

choonghopark@ChoongHoui-MacBookPro ~                                                                               ✔
❯❯❯

Flags & Options

명령어에 여러 flag와 option을 줄 수 있습니다. 대개 -로 시작합니다.

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ ls -l
total 840
drwxr-xr-x@ 10 choonghopark  staff     320 Apr  1 21:23 Development_Document
drwxr-xr-x@ 24 choonghopark  staff     768 Mar 29 23:00 Programming
drwxr-xr-x@ 13 choonghopark  staff     416 Dec 20 19:42 async-message-poc
-rw-r--r--@  1 choonghopark  staff  428067 Dec 20 18:43 async-message-poc.zip

-llong listing format으로 더 자세한 정보를 확인하고자 할때 사용하는 flag입니다. 위 터미널에 찍힌 정보들이 어떤 것인지 한번 알아봅시다.

먼저 맨 처음에 보이는 ddirectory를 의미합니다. -로 시작하는 것은 파일입니다. 그 뒤에 오는 단어들은 해당 파일과 폴더에 대한 권한을 의미합니다. 예를 들어

-rw-r--r--@ 1 choonghopark staff 428067 Dec 20 18:43 async-message-poc.zip를 보면 3단어씩 나눌 수 있습니다. rw-, r--, r-- 이렇게 나뉘는데 처음은 파일 소지자, 다음은 파일 소지자가 속한 그룹, 마지막은 모든 이용자에 대한 권한입니다.

만약 3단어가 다 있다면 rwx가 되는데 r은 읽기 권한. w는 쓰기 권한, x는 실행 권한을 의미합니다. 위에서 rw-가 있는 것은 해당 파일 소유자는 읽고 쓸 수 있는 권한은 있지만 실행할 권한은 없다는 것을 나타냅니다.

폴더는 조금 다르게 접근해야 합니다. 폴더에서 r은 해당 폴더에 어떤 파일 및 폴더가 있는지 확인할 수 있는 권한입니다. w은 해당 폴더안에서 파일을 생성하고 삭제하고 파일이름을 변경가능한 권한입니다. 예를 들어 어떤 파일에 대한 w 권한이 있어도 해당 파일이 위치한 폴더에 대한 w 권한이 없으면 해당 파일을 삭제할 수 없게 됩니다. x는 해당 폴더에 들어갈 수 있는 권한입니다.

cf) 맨앞에 l이 온 경우는 멀까?

mv

mv는 파일이나 폴더를 옮기거나 새로 이름을 지을 떄 사용합니다.

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ mv async-message-pocd.zip async.zip
async-message-pocd.zip -> async.zip

cp

cp는 약어 의미 그대로 복사(copy)를 나타냅니다.

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ cp async.zip message.zip
async.zip -> message.zip

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ ls
Development_Document async-message-poc    message.zip
Programming          async.zip

message.zip이라는 파일이 새로 생성되었씁니다.

rm

rm은 특정 파일 및 폴더를 삭제하는 명령어입니다.

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ rm message.zip
remove message.zip? y
message.zip

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ ls
Development_Document async-message-poc
Programming          async.zip

rm 명령어로는 폴더를 삭제 할 수 없습니다. 왜냐하면 Unix 기반 시스템에서 rm은 recursive하게 동작하지 않기 때문입니다. recursive하게 사용하고 싶으면 -r flag를 주어야합니다. rmdir명령어로 폴더를 삭제할 수 있는데 삭제하려는 폴더가 빈 폴더인 경우에만 동작합니다.

mkdir

mkdir 폴더를 생성할 수 있는 명령어입니다.

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ mkdir missing

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ ls
Development_Document async-message-poc    missing
Programming          async.zip

man

man 프로그램 manual 페이지를 보여주는 명령어입니다.

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ man echo

ECHO(1)                   BSD General Commands Manual                  ECHO(1)

NAME
     echo -- write arguments to the standard output

SYNOPSIS
     echo [-n] [string ...]

DESCRIPTION
     The echo utility writes any specified operands, separated by single blank
     (` ') characters and followed by a newline (`\n') character, to the stan-
     dard output.

Powerful Shell

streams라는 개념을 활용해 여러가지 프로그램과 파일들을 엮어 더 강력한 도구로써 쉘을 사용할 수 있습니다. 모든 프로그램들은 기본적으로 streams를 갖습니다. streams는 크게 input streamoutput stream로 구분됩니다. 대표적인 ìnput stream으로는 키보드, 터미널이 있습니다. 또한 터미널은 대표적인output stream 이기도 합니다. 쉘은 이것들을 엮어 input과 output을 활용하는 여러가지 방법들을 제공합니다.

< & >

< file은 프로그램 input으로 파일을 사용한다는 뜻이고 > file 은 프로그램 ouput을 파일에 쓴다는 의미입니다.

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ echo hello > hello.txt

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ cat hello.txt
hello
choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ cat < hello.txt
hello
choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ cat < hello.txt > hello2.txt

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ cat hello2.txt
hello

>> & |

>>는 파일에 이어서 쓰는 명령어입니다.

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ cat < hello.txt >> hello2.txt

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ cat hello2.txt
hello
hello

| (pipe)는 왼쪽 프로그램의 output을 오른쪽 program의 input으로 연결하라는 의미를 가진 명령어입니다.

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ ls -l /
total 9
drwxrwxr-x  33 root  admin  1056 Mar 28 12:00 Applications
drwxr-xr-x  67 root  wheel  2144 Mar 18 12:20 Library
drwxr-xr-x@  9 root  wheel   288 Jan  1  2020 System
drwxr-xr-x   5 root  admin   160 Jan  1  2020 Users
drwxr-xr-x   3 root  wheel    96 Mar 20 07:56 Volumes
drwxr-xr-x@ 38 root  wheel  1216 Jan  1  2020 bin
drwxr-xr-x   2 root  wheel    64 Jul  5  2020 cores
dr-xr-xr-x   3 root  wheel  4554 Mar 18 12:21 dev
lrwxr-xr-x@  1 root  wheel    11 Jan  1  2020 etc -> private/etc
lrwxr-xr-x   1 root  wheel    25 Mar 18 12:21 home -> /System/Volumes/Data/home
drwxr-xr-x   2 root  wheel    64 Jul  5  2020 opt
drwxr-xr-x   6 root  wheel   192 Jan  1  2020 private
drwxr-xr-x@ 65 root  wheel  2080 Jan  1  2020 sbin
lrwxr-xr-x@  1 root  wheel    11 Jan  1  2020 tmp -> private/tmp
drwxr-xr-x@ 11 root  wheel   352 Jan  1  2020 usr
lrwxr-xr-x@  1 root  wheel    11 Jan  1  2020 var -> private/var

이 결과에서 마지막줄만 가져오고 싶다고 가정해봅시다. tail을 사용하는데, input 마지막 n개 줄만 가져오는 명령어입니다. 이둘을 어떻게 조합하면 될까요?

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ ls -l / | tail -n1
lrwxr-xr-x@  1 root  wheel    11 Jan  1  2020 var -> private/var

파이프라인을 조합하면 아래와 같이 여러 결과물을 만들어낼 수 있습니다.

choonghopark@ChoongHoui-MacBookPro ~/Desktop                             ✔  20s
❯❯❯ curl --head --silent google.com
HTTP/1.1 301 Moved Permanently
Location: http://www.google.com/
Content-Type: text/html; charset=UTF-8
Date: Thu, 01 Apr 2021 13:25:20 GMT
Expires: Sat, 01 May 2021 13:25:20 GMT
Cache-Control: public, max-age=2592000
Server: gws
Content-Length: 219
X-XSS-Protection: 0
X-Frame-Options: SAMEORIGIN


choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ curl --head --silent google.com | grep -i content-length
Content-Length: 219

choonghopark@ChoongHoui-MacBookPro ~/Desktop                                 ✔
❯❯❯ curl --head --silent google.com | grep -i content-length | cut -d' ' -f2
219

root user

root user는 user id로 숫자 0을 가지는 특별한 user입니다. root user는 시스템에서 원하는 것을 무엇이든 할 수 있는 막강한 권한을 가지고 있습니다. 대개 컴퓨터는 root user가 아닌 상태에서 사용하기가 권장됩니다. 왜냐하면 root user 상태에서 잘못된 프로그램을 돌리면 시스템이 망가질 수 있기 때문입니다. 하지만 우리는 때때로 root user권한으로 컴퓨터를 사용하길 원합니다. 이때 사용하는 프로그램이 바로 sudo입니다. sudo뒤에 원하는 명령어를 입력하면 그 명령어를 root user권한으로 사용하는 것과 동일한 효과를 가지게 됩니다.

xdg-open

xdg-open file하면 해당 파일을 올바르게 실행해주는 명령어입니다. Mac에서는 open입니다.

profile
백엔드 개발자 디디라고합니다.

0개의 댓글