셸(Shell)란?

사용자가 입력한 명령을 읽어 해석하고, 프로그램을 시작하거나 결과를 표시하는 프로그램. Linux에서는 bash나 zsh가 자주 쓰인다. 와일드카드 확장, 변수, 리다이렉션이나 파이프, 작업 제어 등의 기능을 가지며, 명령을 나열한 파일(셸 스크립트)을 실행하여 작업을 자동화할 수도 있다. OS의 중심 부분인 커널을 감싸는 '껍데기(shell)'로서 사용자와의 사이에 선다는 데서 이 이름으로 불린다.

일본어 명칭: シェル

셸(Shell)은(는) Linux와 커맨드 라인 기초, 링커, 로더, 실행 파일 등 2개 분야의 연습 문제 10개에 나와요.

분야: Linux와 커맨드 라인 기초

명령이 실행되기까지

셸은 입력된 한 줄을 읽고 변수 확장, 와일드카드 확장(글로빙), 따옴표 처리를 한 다음, 명령 이름과 인수로 나눕니다. 명령 이름에 슬래시가 없으면 내장 명령을 실행하거나, 환경 변수 PATH의 디렉터리를 순서대로 찾아 발견된 실행 파일을 시작합니다. 리다이렉션이나 파이프 지정에 따라 표준 입력·표준 출력·표준 오류 출력의 행선지를 바꿔 연결하는 것도 셸의 일입니다.

셸 스크립트

명령을 나열한 파일의 첫 줄에 #!/bin/bash 같은 셔뱅을 쓰고 실행 권한을 붙이면, 프로그램과 똑같이 실행할 수 있습니다. 인수는 $1, $2, 인수의 수는 $#, 직전 명령의 종료 상태는 $?로 참조하며, if나 for, while로 조건 분기나 반복을 쓸 수 있습니다. 시뮬레이션 일괄 실행이나 로그 집계처럼 정해진 절차를 자동화하는 데 자주 사용됩니다.

여러 가지 셸

Linux에서 널리 쓰이는 bash 외에, 대화형 기능이 풍부한 zsh나 fish, 가볍고 시작이 빠른 dash 등이 있습니다. POSIX라는 규격으로 정해진 sh 문법만으로 쓴 스크립트는 많은 셸에서 동작합니다. EDA 도구의 환경 설정 스크립트 중에는 csh 계열(csh·tcsh) 문법으로 쓰인 것도 지금도 볼 수 있으며, source로 읽어 들이는 설정 파일은 셸의 종류에 맞춰야 합니다.

도전해 보기: 셸(Shell) 관련 문제

touch는 새 파일을 666에서, mkdir는 새 디렉터리를 777에서 umask의 비트를 제거한 권한으로 만든다. umask가 027인 셸(shell)에서 새 파일과 새 디렉터리를 만들었을 때, 각각의 권한의 조합으로 올바른 것은?

  1. A파일 637, 디렉터리 750
  2. B파일 640, 디렉터리 750
  3. C파일 750, 디렉터리 750
정답과 해설 보기

정답: B. 파일 640, 디렉터리 750

umask는 새로 만드는 파일이나 디렉터리에서 '제거할' 권한 비트를 나타냅니다. 027은 그룹에서 쓰기(2)를, 기타에서 읽기·쓰기·실행(7)을 제거하므로, 파일은 666에서 rw-r-----(640), 디렉터리는 777에서 rwxr-x---(750)가 됩니다. 이것은 8진수의 뺄셈이 아니라 비트마다 제거하는 계산입니다(666 AND NOT 027). 자주 쓰이는 umask 022에서는 같은 계산으로 파일이 644, 디렉터리가 755가 됩니다.

자주 묻는 질문

셸과 터미널은 무엇이 다른가요?

터미널(터미널 에뮬레이터)은 문자를 표시하고 키보드 입력을 받는 창 역할을 하는 프로그램입니다. 셸은 그 안에서 동작하며, 받은 문자열을 명령으로 해석하여 실행합니다. 같은 터미널 안에서 bash에서 zsh로 바꿔 사용할 수도 있습니다.

'source 파일 이름'과 './파일 이름'으로 실행하는 것은 무엇이 다른가요?

./파일 이름으로 실행하면 새로운 셸 프로세스가 스크립트를 실행하므로, 그 안에서 바꾼 변수나 현재 디렉터리는 끝나면 원래 셸에 남지 않습니다. source(또는 .)는 현재 셸 안에서 파일의 내용을 실행하므로, 환경 변수 설정 등이 그대로 남습니다. 도구의 환경을 갖추는 설정 파일을 source로 읽어 들이는 것은 이 때문입니다.

해설 속 셸(Shell)

셸(Shell)이(가) 나오는 문제 (10)

  1. touch는 새 파일을 666에서, mkdir는 새 디렉터리를 777에서 umask의 비트를 제거한 권한으로 만든다. umask가 027인 셸(shell)에서 새 파일과 새 디렉터리를 만들었을 때, 각각의 권한의 조합으로 올바른 것은?
  2. 위의 두 줄을 셸(shell)에서 실행했을 때 표시되는 문자로 올바른 것은?
  3. C 언어의 main 함수가 'return 3;'으로 끝났을 때, 그 값 3은 일반적으로 어떻게 됩니까?
  4. 홈 디렉터리에서 'ls'를 실행하면 notes.txt만 표시되고, 'ls -a'를 실행하면 '.', '..', '.bashrc', 'notes.txt'가 표시되었다. 이 결과에 대한 설명으로 올바른 것은?
  5. 어떤 디렉터리에 a1.txt, a2.txt, a10.txt, b1.txt, c1.txt, a1.csv의 6개 파일이 있다. 이 디렉터리에서 'ls [ab]?.txt'를 실행했을 때 표시되는 파일의 수로 올바른 것은?
  6. GNU의 find로 'find /data -name "*.log" -mtime +7 -size +100M'을 실행했을 때 찾아지는 파일에 대한 설명으로 올바른 것은?
  7. SSH로 접속한 서버에서 시간이 걸리는 처리를 './run.sh &'로 시작한 다음 접속을 끊었더니 처리도 멈춰 버렸다. 접속을 끊은 후에도 처리를 계속하게 하는 시작 방법으로 가장 적절한 것은?
  8. 위의 명령을 순서대로 실행했을 때, 두 echo의 출력으로 올바른 것은?
  9. 현재 디렉터리에 있는, 실행 권한이 붙은 스크립트 run.sh를 'run.sh'라고 입력하여 실행하려고 하면 'command not found'가 되고, './run.sh'라고 입력하면 실행할 수 있었다. 이유로 올바른 것은?
  10. 위의 명령을 순서대로 실행했을 때, 두 bash -c의 출력의 조합으로 올바른 것은?

관련 용어

변수(Variable) 환경 변수(Environment Variable) 반환값(Return Value) 파일 권한(퍼미션) SSH 입출력 리다이렉션(I/O Redirection) 인수(Argument) 슈퍼유저(Superuser) 시그널(Unix 시그널) 심볼릭 링크(Symbolic Link)

용어집으로 돌아가기