더 이상 tistory 블로그를 운영하지 않습니다. glanceyes.github.io에서 새롭게 시작합니다.

새소식

Back-End

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

Image 2022-10-06 오후 9.14.51

컴퓨터 네트워크에 접속된 장치에 할당된 이름이며, 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

16451872928881645187302606

 

일부 명령어에서는 --help 옵션을 사용하여 매뉴얼을 볼 수도 있다.

1645187332883

 

 

mkdir

 

폴더를 생성하는 명령이다. (Make Directory)

예) mkdir test

2022-02-18 오후 9.30.06

mkdir로 디렉토리를 생성하고 ls로 현재 디렉토리 위치에서 폴더와 파일을 확인해 보면 test 폴더가 생긴 걸 확인할 수 있다.

 

 

ls

 

현재 접근한 폴더(디렉토리)에 위치한 폴더와 파일을 확인한다. (List Segments)

ls 뒤에 아무 것도 작성하지 않으면 현재 폴더 기준으로 실행하며, 뒤에 폴더를 작성하면 해당 폴더 기준에서 실행한다.

  • -a: .으로 시작하는 파일, 폴더를 포함하여 전체 파일 및 폴더를 출력한다.
  • -l: 퍼미션, 소유자, 만든 날짜, 용량까지 출력할 수 있다.
  • -h: 용량을 사람이 읽기 쉽도록 B(Byte), K(Kilo Byte), G(Giga Byte) 등으로 표현해 주며, -l과 같이 사용해야 한다.현재 디렉토리인 .와 상위 디렉토리인 .., 그리고 .로 시작하는 파일인 .DS_Store를 확인할 수 있다.
    2022-02-18 오후 9.31.02
    파일 또는 폴더의 용량이 우리가 일상생활에서 자주 사용하는 데이터 단위인 K, B 등으로 표시된 것을 볼 수 있다.1645187431493

 

 

pwd

 

현재 폴더 경로를 절대 경로로 보여준다. (Print Working Directory)

2022-02-18 오후 9.31.54

 

 

cd

 

폴더로 이동한다. (Change Directory)

예) cd test

1645187541862

 

 

echo

 

Python의 print처럼 터미널에 텍스트를 출력한다.

변수에 값을 할당한 상태에서 해당 변수의 값을 보여줄 수도 있다.

예) echo "hi"

1645187559588

 

echo `{shell command}` 입력 시 shell command의 결과를 출력한다.

예) echo `pwd`

2022-02-18 오후 9.33.01

 

 

vi

 

vim 편집기로 파일을 생성하며, Insert 모드에서만 수정할 수 있다.

 

Console에 vi test.sh 입력 후 test.sh 파일이 뜨면 i를 눌러서 Insert 모드로 변경하면 test.sh 파일을 작성하거나 수정할 수 있다.

저장하고 싶은 경우 Esc를 누르고 :wq를 입력하면 된다.

Esc를 누르고 :wq!를 입력하면 강제로 저장하고 나온다.

Esc를 누르고 :q를 입력면 저장하지 않고 나온다.

 

16451876168031645187658590

 

 

bash

 

bash로 shell script를 실행할 수 있다.

일부 지원하는 shell에서는 콘솔에서 tab을 누르면 bash가 자동 완성된다.

sh <shell script 파일명>으로 실행하여 shell script 파일을 실행할 수도 있다.

예) bash test.sh

1645187669698

 

 

sudo

 

관리자(또는 최고 권한) 권한으로 실행하고 싶은 경우 command 앞에 sudo를 붙인다. (Super User Do)

예) sudo rm -rf / 😱 (되도록 하면 안 된다...)

-rf 옵션에서 r은 입력한 디렉토리의 하위 디렉토리까지 재귀적으로(recursively) 삭제하라는 의미이고, f는 폴더에 파일이 존재해도 강제로 삭제하라는 의미이다. 그렇지만 되도록이면 이 옵션은 사용을 지양하는 것이 바람직하다.

1645187693330

 

 

cp

 

파일 또는 폴더를 복사한다. (Copy)

예) cp test.sh test2.sh

1645187757340

test.sh 파일을 test2.sh 파일명으로 복사한다는 의미이다.

-r: 디렉토리를 복사할 때 디렉토리 안에 파일이 있으면 재귀적(recursive)으로 모두 복사한다.

-f: 복사할 때 강제로 실행한다.

 

 

mv

 

파일 또는 폴더를 이동하거나 이름을 바꿀 때 주로 사용한다.

예) mv test.sh test3.sh

1645187796786

test.sh 파일의 파일명을 test3.sh으로 변경한다는 의미이다.

 

 

 

cat

 

특정 파일의 내용을 출력한다.

여러 파일을 argument로 주면 이를 합쳐서(concatenate) 출력한다.

예) cat test2.sh test3.sh

1645187835025

 

파일에 overwrite하여 저장하고 싶은 경우는 redirection인 >를 사용한다.

Redirection에 관한 설명은 아래에서 참고할 수 있다.

예) cat test2.sh test3.sh > test4.sh

1645187886278

 

파일에 내용을 추가(append)하고 싶은 경우는 다음과 같이 한다.

예) cat test2.sh test3.sh >> test5.sh

스크린샷 2022-02-18 오후 9.38.34

 

 

clear

 

콘솔 창을 깨끗하게 해준다.

16451879330801645187941533

 

 

history

 

최근에 입력한 shell command의 명령 내역을 출력한다.

2022-02-18 오후 9.39.23

 

History 결과에서 느낌표(!)를 붙이고 수를 입력하면 해당 번호의 command를 다시 활용할 수 있다.

1645187997249

 

 

find

파일 또는 폴더를 검색할 때 사용한다.

예) find . -name "test2.sh": 현재 폴더에서 test2.sh라는 이름을 가진 파일 또는 폴더를 검색한다.

스크린샷 2022-02-18 오후 9.41.00

 

 

export

환경변수를 설정할 때 사용한다.

예) export love="사랑" && echo $love

1645188115129

love라는 환경변수를 설정하고 이 값을 출력한다.

 

콘솔에 단순히 export로 환경변수를 설정하면 해당 콘솔이 종료되고 새로운 콘솔 창을 실행했을 때 앞에서 설정한 환경변수를 사용할 수 없다.

매번 shell을 실행할 때마다 저장한 환경변수를 사용하고 싶으면 vi ~/.profile, vi ~/.bashrc, vi ~/.zshrc 등으로 파일을 열어서 환경변수를 선언하고 저장하면 된다. 사용하고 있는 shell에 따라서 저장할 수 있는 환경변수 파일이 다르다.

재로그인하지 않고 즉시 변경된 환경변수 설정을 사용하고 싶으면 source ~/.profile, source ~/.bashrc, source ~/.zshrc 등 명령을 통해 바로 적용한다.

 

 

alias

콘솔에서 명령어를 별칭으로 설정할 때 사용하며, 기본 명령어를 간단히 줄일 수 있다.

예) alias ll2='ls -l'

1645188173407

ll2를 입력하면 ls -l이 동장한다.

 

 

wget

웹상에 존재하는 단일 파일다운로드 받아서 현재 폴더에 저장할 때 주로 사용하는 명령어이다. (Web Get)

예) wget {다운로드 URL}

2022-02-18 오후 9.45.16

 

 

head, tail

파일의 앞 또는 뒤 $n$개의 행을 출력한다.

예) tail -n 3 test5.sh

1645188393493

 

 

sort

행 단위로 정렬할 때 사용한다.

  • -r: 내림차순으로 정렬한다. (Default는 오름차순이다.)
  • -n: numeric sort를 진행한다.

예) cat cities.txt | sort

1645188530626

 

 

uniq

중복된 행이 연속으로 있는 경우 중복을 제거한다.

sort와 함께 사용하면 유용하다.

  • -c: 중복 행의 개수를 출력한다.

예) cat cities.txt | sort | uniq

2022-02-18 오후 9.50.13

 

 

grep

파일에서 주어진 패턴 목록과 매칭되는 라인을 검색한다. (Globally search for a Regular Expression and Print matching lines)

예) grep {옵션} {패턴} {파일명}

  • -i: Insensitively하게(대소문자 구분 없이) 찾는다.
  • -w: 정확히 그 단어만 찾기
  • -v: 특정 패턴 제외한 결과 출력
  • -E: 정규 표현식 사용

 

정규 표현식 패턴

  • ^{단어}: 해당 단어로 시작하는 것을 찾는다.
  • {단어}$: 해당 단어로 끝나는 것을 찾는다.
  • .: 하나의 문자에 매칭된다.

예) grep -i awa$ cities.txt

1645188694316

 

 

cut

파일에서 특정 필드를 추출할 때 사용한다.

  • -f: 잘라낼 필드를 서수로 지정한다.
  • -d: 필드를 구분하는 구분자이며, Default는 \t이다.

예) cat test | cut -d : -f 1,3

1645188816468

:로 필드를 구분 지은 후, 구분된 필드에서 1번째, 3번째 값을 가져온다.

 

 

wc

옵션에 따라 파일 또는 stdin바이트, 문자, 단어, 줄 수를 출력할 수 있는 명령어이다. (Word Count)

  • -l: 줄 수
  • -w: 단어 수
  • -c: 문자 수

예) cat cities.txt | sort | uniq | wc -l

1645188848874

 

 

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
    1645188959858
  • : 덮어쓰기(overwriting)할 파일이 없으면 새로 생성하고 저장한다.
  • >>
    • 예) echo "hi" >> test.sh 1645189003037
  • : 파일, 출력 등의 맨 뒤에 추가(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)을 찾아서 사전 순으로 정렬하라는 명령어다.

1645189077264

 

예) ps -aux | grep root | tail

현재 process list에서 root를 패턴으로 지니는 문장(line)을 찾아서 끝에서 10개의 줄만 출력하라는 명령어다.

Image 2022-10-06 오후 9.19.55

 

 

Shell Script

 

Shell Script = Shell Command의 조합

 

Shell script는 복잡하게 생각할 필요 없이, 별도의 파일로 수행할 shell command를 정의하여 저장하고 이를 원하는 시점에 shell script 파일을 실행하고자 하는 용도로 사용된다. 그래서 .sh 확장자 파일을 생성하고, 그 안에 실행할 shell command를 작성한 것이다.

if문 또는 while loop처럼 제어문을 사용할 수 있으며, bash {파일명}, sh {파일명} 등으로 실행 가능하다.

Image 2022-10-06 오후 9.18.03

 

 

Shebang(셔뱅)

 

#!로 시작하는 문자열이며, 주로 script의 맨 첫 번째 라인에 있다.

Unix 계열 운영 체제에서 script를 실행할 때 어떤 인터프리터로 해석할지 지정할 수 있다.

인터프리터를 지정할 때 실행할 프로그램의 절대 경로로 지정한다.

예) #!/bin/bash: /bin/sh 경로의 본 shell 또는 호환 shell을 사용하여 파일을 실행한다.

절대 경로는 사용자마다 다를 수 있음을 유의한다.

Image 2022-10-06 오후 9.18.52

 

출처
1. 네이버 부스트캠프 AI Tech Level 3 Product Serving 변성윤 마스터님 Linux 강의 (Linux shell 명령어)
2. 서강대학교 CSE4070 운영체제 박성용 교수님 강의 (IPC 관련 내용)
Contents

글 주소를 복사했습니다

부족한 글 끝까지 읽어주셔서 감사합니다.
보충할 내용이 있으면 언제든지 댓글 남겨주세요.