Linux(리눅스) Shell Command(쉘 명령어)
- -
들어가기 전에
우리는 대개 컴퓨터를 주로 사용할 때 마우스를 움직여서 어떠한 그래픽 요소을 다루는 GUI(Graphic User Interface)에 익숙한 경우가 많다. 그러나 처음으로 Linux 또는 Unix를 접할 때 그동안 생전 보지 못했던 CLI(Command Line Interface)를 만날 수 있다. 막상 첫 CLI를 다룰 때는 어색할 수 있어도 기본적인 명령어를 익히고 Linux 환경에서 프로그램이나 시스템을 다룰수록 CLI의 편리함과 매력을 느끼게 될 것이다. 이번 글에서는 Linux에 관한 간단한 소개와 기본적인 명령어를 소개하고, 각각의 명령어가 구체적으로 어떠한 역할을 하는지 예시를 통해 다뤄볼 것이다.
Linux
Linux를 왜 알아야 할까?
Linux는 서버에서 일반적으로 흔히 사용되는 OS이며, Mac, Windows도 서버로 활용은 가능하지만 유료라는 단점이 있는데 반해 Linux는 오픈소스여서 무료라는 장점을 지니고 있다. 또한 Linux는 여러 버전이 존재하여 자신만의 버전을 찾아서 만들 수 있다는 높은 scability가 장점이다. 특히 짧지 않은 역사로 인해 안정성과 신뢰성을 담보할 수 있으며, Unix에 속하므로 stability, reliability의 특성을 지니기도 한다.
그러나 Linux는 아래에서 설명할 CLI(Command Line Interface) 기반으로 사용하는 경우가 많으므로 기본적인 shell command를 익히고 shell script를 다룰 필요성이 있다.
CLI과 GUI
CLI (Command Line Interface)
주로 terminal로 작동하는 인터페이스이며, Linux에서 사용하는 shell script가 여기에 해당된다.
GUI (Graphic User Interface)
CLI와 달리 마우스, 손가락 등으로 터치를 하며 직접 눈으로 보면서 조작할 수 있는 인터페이스이다.
Linux를 사용하는 방법
Linux는 범용성이라는 특성을 지니고 있으므로 다양한 곳에 설치하여 사용할 수 있으며, 일례로 virtualBox에 Linux를 설치할 수도 있고, Docker로 설치를 진행할 수도 있다.
다른 운영체제를 사용 중인 컴퓨터에서도 Linux를 경험할 수 있는데, Windows에서는 WSL, macOS에서는 터미널을 사용하면 된다.
심지어 Jupyter Notebook에서도 터미널을 실행할 수 있다.
Shell Command
Shell의 종류
Shell
사용자가 문자를 입력해 컴퓨터에 명령할 수 있도록 하는 프로그램이며, prompt를 보여줌으로써 사용자로부터 명령을 입력받고 실행한다.
Shell은 기본적으로 다음과 같은 흐름을 거쳐 작동하는데, 먼저 사용자가 shell에 실행 가능한 프로그램의 이름과 그 프로그램을 실행하기 위한 인자를 입력한다.
그리고 나서 shell은 파일 시스템에서 실행 가능한 명령이 디스크의 어느 부분에 있는지 찾고, fork()라는 system call을 호출함으로써 새로운 child process를 만든다.
또한 child process 내에서도 execl(), execvp() 등 여러 exec() system call을 통해 명령을 수행하는 process를 실행하며, shell은 앞에서 생성된 child process가 실행 완료될 때까지 wait()을 통해 기다린다.
이후 wait()으로부터 정상적으로 반환값을 받으면 prompt를 다시 출력하고, shell은 사용자로부터 새로운 명령을 받기 위해 기다린다.
정리하자면, shell은 OS에서 제공하는 system call을 통해 사용자로부터 입력받은 명령을 실행하는 역할을 하며, shell도 결국 사용자 프로그램이라는 사실을 염두에 두어야 한다.
Shell의 종류에는 여러 가지가 있는데, 그중 sh(최초의 shell), bash(Linux 표준 쉘), zsh(macOS 카탈리나 이상)이 유명하다.
Terminal(Console)
Shell을 실행하기 위해 prompt로 문자로 구성된 명령을 입력 받아 컴퓨터에 이를 전달하는 역할을 하며, 프로그램의 출력을 화면에 작성할 수 있다.
Hostname
컴퓨터 네트워크에 접속된 장치에 할당된 이름이며, IP 대신 기억하기 쉬운 글자로 저장된다.
즉, 로그인할 때 컴퓨터 이름을 정한 것으로 이해할 수 있다.
Shell을 사용하는 경우
Shell은 다음과 같은 상황에서 사용할 수 있다.
- 서버에서 접속해서 사용하는 경우
- crontab 등 Linux의 내장 기능을 활용하는 경우
- 데이터 전처리를 하기 위해 shell command를 사용하는 경우
- Docker를 사용하는 경우
- 수 백대의 서버를 관리할 경우
- Jupyter Notebook의 cell 앞에
!
를 붙여서 shell command를 사용하는 경우 - 터미널에서 python3, jupyter notebook을 실행하는 경우
- 배포 파이프라인(Github Action 등)을 실행하는 경우
알아두면 좋은 기본적인 Shell Command
아래 표에 기본으로 알아야 할 필수 shell 명령어를 간단한 설명과 함께 정리하였다. 아래의 명령어는 손에 익을 수 있도록 익혀두는 것이 좋으며, 사용하다가 잊어버리거나 모르는 명령어가 있으면 바로 표를 찾아보는 것을 권장한다. 대체로 명령어의 이름들은 각 명령어의 역할의 줄임말인 경우가 많으므로 명령어의 이름을 보고 해당 명령어가 어떠한 역할을 하는지를 자연스럽게 연상시키는 방식으로 외워도 좋다.
이름 | 설명 |
---|---|
man | command, system call, function 등 다양한 리눅스 명령어의 사용법을 확인할 수 있다. |
mkdir | 디렉토리를 생성한다. (make directory) |
ls | 현재 위치한 디렉토리에 있는 폴더와 파일 확인할 때 사용하며, 여러 옵션을 통해 추가적인 정보를 확인할 수 있다. |
pwd | 현재 위치한 디렉토리를 출력한다. (print working directory) |
cd | 현재 디렉토리 위치를 다른 위치로 변경한다. (change directory) |
echo | 변수 값, 문자열 등 텍스트를 출력한다. |
bash | shell script(쉘 스크립트)를 실행한다. |
sudo | 다른 사용자의 권한을 얻는 것(substitute user do)이며, 관리자 권한으로 특정 명령을 수행해야 할 때 사용한다. |
cp | 파일을 복사한다. (copy) |
mv | 파일을 다른 디렉토리 위치로 이동하며, 파일 이름을 변경할 때도 사용할 수 있다. (move) |
clear | console에 있는 명령어를 모두 지운다. (cls, clean screen) |
cat | 파일의 내용을 텍스트로 출력할 수 있으며, 인자를 여러 개 주어서 여러 파일을 붙여서 출력할 수 있다. (concatenate) |
history | 이전에 사용된 명령어 이력을 볼 수 있다. |
find | 폴더 또는 파일을 검색할 때 사용한다. |
export | 환경변수를 설정한다. |
cut -f -d | delimeter를 기준으로 잘라 field번째 값을 출력한다. (-d: delimeter, -f:field) |
redirection (>, >>) | 프로그램의 출력(stdout)을 다른 파일이나 스트림으로 전달한다. |
pipe ( | ) | 어떤 한 프로그램의 출력을 다른 프로그램의 입력으로 사용한다. |
ps | 현재 실행 중인 process를 확인할 수 있다. (process status) (-f: full format, -e: 모든 프로세스) |
curl | 웹 서버에 요청을 보낼 수 있으며, 주로 웹으로부터 파일을 다운로드받을 때 사용한다. (client URL) |
grep | 파일 또는 텍스트에서 특정 키워드가 포함된 줄만 출력한다. (g / re / p) |
chmod | 파일 권한을 변경한다. (change mode) |
nohup | 터미널 종료 후에도 계속 작업이 유지되도록 백그라운드로 process를 실행할 때 사용한다. (예: nohup helloword.py &) |
scp | ssh로 연결된 호스트 사이에 파일을 복사할 때 사용한다. (secure copy) (-r: 하위 디렉토리를 포함해서 재귀적으로 복사, -P: ssh 포트 지정 -i: SSH 설정을 활용해 실행) |
df | 현재 파일 시스템이 얼만큼의 디스크 용량을 차지하는지 확인할 수 있다. (disk file system) |
wc | 옵션에 따라 파일 또는 stdin 의 바이트, 문자, 단어, 줄 수를 출력할 수 있다. (word count) |
자주 사용하는 명령어에 관한 설명과 실행 예시
man
Shell command의 매뉴얼 문서를 보고 싶을 때 사용할 수 있다.
종료하고 싶은 경우 Esc
를 누르고 :q
를 입력하면 된다.
예) man python
일부 명령어에서는 --help
옵션을 사용하여 매뉴얼을 볼 수도 있다.
mkdir
폴더를 생성하는 명령이다. (Make Directory)
예) mkdir test
mkdir
로 디렉토리를 생성하고 ls
로 현재 디렉토리 위치에서 폴더와 파일을 확인해 보면 test
폴더가 생긴 걸 확인할 수 있다.
ls
현재 접근한 폴더(디렉토리)에 위치한 폴더와 파일을 확인한다. (List Segments)
ls
뒤에 아무 것도 작성하지 않으면 현재 폴더 기준으로 실행하며, 뒤에 폴더를 작성하면 해당 폴더 기준에서 실행한다.
-a
:.
으로 시작하는 파일, 폴더를 포함하여 전체 파일 및 폴더를 출력한다.-l
: 퍼미션, 소유자, 만든 날짜, 용량까지 출력할 수 있다.-h
: 용량을 사람이 읽기 쉽도록 B(Byte), K(Kilo Byte), G(Giga Byte) 등으로 표현해 주며,-l
과 같이 사용해야 한다.현재 디렉토리인.
와 상위 디렉토리인..
, 그리고.
로 시작하는 파일인.DS_Store
를 확인할 수 있다. 파일 또는 폴더의 용량이 우리가 일상생활에서 자주 사용하는 데이터 단위인 K, B 등으로 표시된 것을 볼 수 있다.
pwd
현재 폴더 경로를 절대 경로로 보여준다. (Print Working Directory)
cd
폴더로 이동한다. (Change Directory)
예) cd test
echo
Python의 print
처럼 터미널에 텍스트를 출력한다.
변수에 값을 할당한 상태에서 해당 변수의 값을 보여줄 수도 있다.
예) echo "hi"
echo `{shell command}`
입력 시 shell command의 결과를 출력한다.
예) echo `pwd`
vi
vim 편집기로 파일을 생성하며, Insert 모드에서만 수정할 수 있다.
Console에 vi test.sh
입력 후 test.sh
파일이 뜨면 i
를 눌러서 Insert 모드로 변경하면 test.sh
파일을 작성하거나 수정할 수 있다.
저장하고 싶은 경우 Esc
를 누르고 :wq
를 입력하면 된다.
Esc
를 누르고 :wq!
를 입력하면 강제로 저장하고 나온다.
Esc
를 누르고 :q
를 입력면 저장하지 않고 나온다.
bash
bash로 shell script를 실행할 수 있다.
일부 지원하는 shell에서는 콘솔에서 tab
을 누르면 bash
가 자동 완성된다.
sh <shell script 파일명>
으로 실행하여 shell script 파일을 실행할 수도 있다.
예) bash test.sh
sudo
관리자(또는 최고 권한) 권한으로 실행하고 싶은 경우 command 앞에 sudo
를 붙인다. (Super User Do)
예) sudo rm -rf /
😱 (되도록 하면 안 된다...)
-rf
옵션에서 r
은 입력한 디렉토리의 하위 디렉토리까지 재귀적으로(recursively) 삭제하라는 의미이고, f
는 폴더에 파일이 존재해도 강제로 삭제하라는 의미이다. 그렇지만 되도록이면 이 옵션은 사용을 지양하는 것이 바람직하다.
cp
파일 또는 폴더를 복사한다. (Copy)
예) cp test.sh test2.sh
test.sh
파일을 test2.sh
파일명으로 복사한다는 의미이다.
-r
: 디렉토리를 복사할 때 디렉토리 안에 파일이 있으면 재귀적(recursive)으로 모두 복사한다.
-f
: 복사할 때 강제로 실행한다.
mv
파일 또는 폴더를 이동하거나 이름을 바꿀 때 주로 사용한다.
예) mv test.sh test3.sh
test.sh
파일의 파일명을 test3.sh
으로 변경한다는 의미이다.
cat
특정 파일의 내용을 출력한다.
여러 파일을 argument로 주면 이를 합쳐서(concatenate) 출력한다.
예) cat test2.sh test3.sh
파일에 overwrite하여 저장하고 싶은 경우는 redirection인 >
를 사용한다.
Redirection에 관한 설명은 아래에서 참고할 수 있다.
예) cat test2.sh test3.sh > test4.sh
파일에 내용을 추가(append)하고 싶은 경우는 다음과 같이 한다.
예) cat test2.sh test3.sh >> test5.sh
clear
콘솔 창을 깨끗하게 해준다.
history
최근에 입력한 shell command의 명령 내역을 출력한다.
History 결과에서 느낌표(!
)를 붙이고 수를 입력하면 해당 번호의 command를 다시 활용할 수 있다.
find
파일 또는 폴더를 검색할 때 사용한다.
예) find . -name "test2.sh"
: 현재 폴더에서 test2.sh
라는 이름을 가진 파일 또는 폴더를 검색한다.
export
환경변수를 설정할 때 사용한다.
예) export love="사랑" && echo $love
love
라는 환경변수를 설정하고 이 값을 출력한다.
콘솔에 단순히 export
로 환경변수를 설정하면 해당 콘솔이 종료되고 새로운 콘솔 창을 실행했을 때 앞에서 설정한 환경변수를 사용할 수 없다.
매번 shell을 실행할 때마다 저장한 환경변수를 사용하고 싶으면 vi ~/.profile
, vi ~/.bashrc
, vi ~/.zshrc
등으로 파일을 열어서 환경변수를 선언하고 저장하면 된다. 사용하고 있는 shell에 따라서 저장할 수 있는 환경변수 파일이 다르다.
재로그인하지 않고 즉시 변경된 환경변수 설정을 사용하고 싶으면 source ~/.profile
, source ~/.bashrc
, source ~/.zshrc
등 명령을 통해 바로 적용한다.
alias
콘솔에서 명령어를 별칭으로 설정할 때 사용하며, 기본 명령어를 간단히 줄일 수 있다.
예) alias ll2='ls -l'
ll2
를 입력하면 ls -l
이 동장한다.
wget
웹상에 존재하는 단일 파일을 다운로드 받아서 현재 폴더에 저장할 때 주로 사용하는 명령어이다. (Web Get)
예) wget {다운로드 URL}
head
, tail
파일의 앞 또는 뒤 $n$개의 행을 출력한다.
예) tail -n 3 test5.sh
sort
행 단위로 정렬할 때 사용한다.
-r
: 내림차순으로 정렬한다. (Default는 오름차순이다.)-n
: numeric sort를 진행한다.
예) cat cities.txt | sort
uniq
중복된 행이 연속으로 있는 경우 중복을 제거한다.
sort
와 함께 사용하면 유용하다.
-c
: 중복 행의 개수를 출력한다.
예) cat cities.txt | sort | uniq
grep
파일에서 주어진 패턴 목록과 매칭되는 라인을 검색한다. (Globally search for a Regular Expression and Print matching lines)
예) grep {옵션} {패턴} {파일명}
-i
: Insensitively하게(대소문자 구분 없이) 찾는다.-w
: 정확히 그 단어만 찾기-v
: 특정 패턴 제외한 결과 출력-E
: 정규 표현식 사용
정규 표현식 패턴
^{단어}
: 해당 단어로 시작하는 것을 찾는다.{단어}$
: 해당 단어로 끝나는 것을 찾는다..
: 하나의 문자에 매칭된다.
예) grep -i awa$ cities.txt
cut
파일에서 특정 필드를 추출할 때 사용한다.
-f
: 잘라낼 필드를 서수로 지정한다.-d
: 필드를 구분하는 구분자이며, Default는\t
이다.
예) cat test | cut -d : -f 1,3
:
로 필드를 구분 지은 후, 구분된 필드에서 1번째, 3번째 값을 가져온다.
wc
옵션에 따라 파일 또는 stdin
의 바이트, 문자, 단어, 줄 수를 출력할 수 있는 명령어이다. (Word Count)
-l
: 줄 수-w
: 단어 수-c
: 문자 수
예) cat cities.txt | sort | uniq | wc -l
vi
편집기
vi
편집기 모드
Command Mode
vi
실행 시 기본 모드이며, 방향키를 통해 커서(cursor)를 이동할 수 있다.
dd
: 현재 위치한 한 줄을 삭제한다.i
: INSERT 모드로 변경한다.x
: 커서가 위치한 곳의 글자 1개를 삭제한다.- 예)
5x
: 문자를 5개 삭제한다.
- 예)
yy
: 현재 줄을 복사한다.p
: 현재 커서가 있는 줄 바로 아래에 붙여넣기를 한다.k
: 커서를 위로 이동한다.j
: 커서를 아래로 이동한다.l
: 커서를 오른쪽으로 이동한다.h
: 커서를 왼쪽으로 이동한다.
Insert Mode
vim 편집기로 파일을 수정할 수 있는 모드이며, Command Mode로 이동하고 싶으면 Esc
를 누른다.
Last Line Mode
Esc
를 누른 후 콜론(:
)을 누르면 나오는 모드이다.
w
: 현재 파일명으로 저장한다.q
:vi
를 저장하지 않고 종료한다.q!
:vi
를 강제로 종료한다. (!는 강제로 명령한다는 뜻이다.)wq
: 저장한 주 종료한다.\{문자}
: 문자를 탐색한다.- 탐색한 후
n
을 누르면 계속 탐색을 실행한다.
- 탐색한 후
set nu
: vi 라인의 번호를 출력한다.
표준 스트림(Stream)
Unix에서 동작하는 프로그램은 command 실행할 때 3개의 stream이 생성된다.
stdin
: 0으로 표현되고, 입력에 해당된다.stdout
: 1로 표현되고, 출력 값에 해당된다.stderr
: 2로 표현되고, 디버깅 정보나 에러를 출력한다.
Redirection & Pipe
IPC(Inter-Process Communication)란?
Linux와 같은 운영체제에서는 기본적으로 메모리 가상화(emory Virtualization)를 위해 각 process는 자신만의 가상 메모리 공간(virtual address space)를 가지는 것처럼 동작하게 하며, 이 가상 메모리 공간에 대응되는 물리 메모리 공간(physical address space)도 실제 가상 메모리 공간만큼의 용량을 차지하지는 않을 수 있지만 process마다 서로 다른 메모리 공간에서 동작한다.
그런데 프로그램을 실행하다 보면 서로 다른 process끼리 데이터를 주고받는 통신이 필요한 순간이 있을 텐데, 모든 process는 각각 다른 address space에서 동작하므로 I/O(Input/Output)을 통해 파일을 읽거나 쓰지 않는 이상 데이터를 주고받을 수 있는 방법이 없다. 이를 해결하고자 IPC(Inter-Process Communication)라는 매커니즘을 사용하여 다양한 process끼리 서로 통신을 할 수 있도록 하는데, 그중 아래에서 소개할 redirection과 pipe이 IPC에 속한다.
Redirection
프로그램의 출력(stdout)을 다른 파일이나 스트림으로 전달하는 역할을 한다.
>
- 예)
echo "hi" > test.sh
- 예)
- : 덮어쓰기(overwriting)할 파일이 없으면 새로 생성하고 저장한다.
>>
- 예)
echo "hi" >> test.sh
- 예)
- : 파일, 출력 등의 맨 뒤에 추가(append)한다.
Pipe
Pipe란?
Pipe는 byte를 흐르게 하는 단방향 스트림(stream)이라고 흔히 말하는데, 여기서 스트림은 말 그대로 데이터가 마치 물처럼 흘러간다는 것을 의미한다. 단방향으로 데이터를 흐르게 하는 역할을 하므로 어떤 한 process에서 다른 한 process로 정보를 흐르게 하며, 자료구조의 관점에서 보자면 먼저 pipe로 들어온 데이터가 가장 처음으로 다른 process로 전달되는 FIFO(First-In First-Out) queue로도 볼 수 있다.
좀 더 정확하게 설명하자면 두 개의 process를 pipe로 연결했을 때 pipe는 데이터를 임시로 저장할 수 있는 시스템 내의 buffer이고, 한 process에서 pipe에 데이터를 쓰면 다른 process에서 이를 읽어와서 데이터를 전달받을 수 있다. 또한 임시로 buffer에 데이터를 쓰고 읽기 때문에 마치 물 흐르듯이 데이터가 흘러가는 것처럼 보이게 되는 것이다. 즉, pipe는 데이터를 읽고 쓸 수 있는 특별한 종류의 파일이라고 볼 수 있고, 다른 의미로 process에서 file descriptor로 참조 가능한 kernel buffer이다.
Pipe는 header 등 일반적으로 파일 시스템에서 따라야 하는 형식(format)이 없고, 얼만큼의 데이터가 pipe에 써지는지 그 데이터의 크기도 알 수 없으므로 비구조적인 통신(non-structured communication)이다.
Pipe의 종류
Anonymous Pipe
내부적으로 kernel buffer인 file이지만 별도의 파일 이름이 존재하지 않는(anonymous) pipe이며, 부모 process에서 자식 process를 fork한 후 부모와 자식 또는 조상과 후손 사이에서 통신할 때 사용한다. 말 그대로 이름이 존재하지 않으므로 anonymous pipe를 사용하여 통신을 하려면 자식 process를 fork할 때 부모의 file descriptor가 그대로 자식에게 복사되면서 사용될 수밖에 없는 구조이다. 즉, 이름이 존재하지 않는 pipe이므로 해당 pipe의 존재를 알고 있는 process는 어떤 한 process와 그 후손들 밖에 알지 못하는 것이다.
Named Pipe
내부적으로 kernel buffer인 file이지만 anonymous pipe와는 달리 정형화 시켜놓은 file이라고 볼 수 있다. 다시 말해, 꼭 부모와 자식 간의 관계인 process가 아니더라도 독립적인 process끼리 파일 시스템을 통해 통신할 수 있는 pipe이다. Pipe의 이름이 존재하며, open, close, write, read의 system call처럼 거의 파일과 같이 다뤄진다고 보면 된다.
Named pipe는 mkfifo()
또는 mknod
명령어를 통해 생성할 수 있으며, unlink()
로 파일 시스템에 만든 entry를 지움으로써 이미 생성한 pipe를 해제할 수도 있다. 단, 독립적인 process끼리 같은 파일을 공유하는 것과 마찬가지이기 때문에 기본적으로 synchronization이 보장될 수 있도록 한다. 예를 들어 어떤 한 process A가 생성한 named pipe에 데이터를 write하려고 하는데 이 데이터를 받고자 하는 process가 없으면 굳이 pipe를 사용해야 할 이유가 없다.
이를 위해 기본적으로 mkfifo
를 통해 생성한 pipe를 읽으려고 할 때 다른 process가 해당 pipe를 통해 쓰려고 할 때까지 block되는 O_RDONLY
옵션이 있으며, 마찬가지로 pipe를 통해 쓰려고 할 때도 다른 process가 해당 pipe를 통해 읽으려고 할 때까지 block 되는 O_WRONLY
옵션이 있다. 그러나 만약에 O_NONBLOCK
옵션을 같이 넣으면 이러한 기다림(block) 없이 다음 코드가 바로 실행되며, 이는 주로 비동기 작업을 할 때 사용할 수 있다.
Pipe의 사용 예시
앞서 설명한 내용은 pipe에 관해 깊이 파고든 내용이지만, linux를 사용하는 우리 입장에서는 간단히 프로그램의 출력(stdout)을 다른 프로그램의 입력으로 사용할 때 쓴다고 이해하고 사용하면 편하다.
특히 아래의 예시처럼 다양한 command와 조합하여 사용할 수 있다.
예) A | B
: A의 출력을 B의 입력으로 사용한다.
예) grep -i awa$ cities.txt | sort
cities.txt 파일에서 대소문자 구분없이 awa로 끝나는 문장(line)을 찾아서 사전 순으로 정렬하라는 명령어다.
예) ps -aux | grep root | tail
현재 process list에서 root를 패턴으로 지니는 문장(line)을 찾아서 끝에서 10개의 줄만 출력하라는 명령어다.
Shell Script
Shell Script = Shell Command의 조합
Shell script는 복잡하게 생각할 필요 없이, 별도의 파일로 수행할 shell command를 정의하여 저장하고 이를 원하는 시점에 shell script 파일을 실행하고자 하는 용도로 사용된다. 그래서 .sh
확장자 파일을 생성하고, 그 안에 실행할 shell command를 작성한 것이다.
if문 또는 while loop처럼 제어문을 사용할 수 있으며, bash {파일명}
, sh {파일명}
등으로 실행 가능하다.
Shebang(셔뱅)
#!
로 시작하는 문자열이며, 주로 script의 맨 첫 번째 라인에 있다.
Unix 계열 운영 체제에서 script를 실행할 때 어떤 인터프리터로 해석할지 지정할 수 있다.
인터프리터를 지정할 때 실행할 프로그램의 절대 경로로 지정한다.
예) #!/bin/bash
: /bin/sh
경로의 본 shell 또는 호환 shell을 사용하여 파일을 실행한다.
절대 경로는 사용자마다 다를 수 있음을 유의한다.
출처
1. 네이버 부스트캠프 AI Tech Level 3 Product Serving 변성윤 마스터님 Linux 강의 (Linux shell 명령어)
2. 서강대학교 CSE4070 운영체제 박성용 교수님 강의 (IPC 관련 내용)
'Back-End' 카테고리의 다른 글
원격 서버에서 Jupyter Notebook 또는 Jupyter Lab을 실행하여 접속하기 (1) | 2022.10.08 |
---|---|
Visual Programming으로 AI 모델링이 가능한 웹 어플리케이션 개발 후기 (0) | 2022.09.01 |
GCP(Google Cloud Platform) VM 인스턴스 생성하기 (0) | 2022.07.19 |
AWS CodeDeploy로 배포할 때 환경변수 사용하는 방법, Parameter Store (0) | 2022.06.16 |
[RepositoryNotFoundError] TypeORM에서 Entity를 찾지 못하는 문제 해결 방법 (0) | 2022.06.16 |
소중한 공감 감사합니다.