리눅스 쉘(shell)의 이해

2021. 4. 23. 17:00 OS/Linux

쉘(shell)

쉘(shell) 명령어 해석기, 명령행 인터페이스이자 스크립트 언어이다.

유닉스 계열의 운영체제는 보통 텍스트 모드의 터미널 화면에서 명령행에 명령어를 타이핑 하여 사용한다. 이 명령어를 해석하는 프로그램 쉘(shell)이다. 즉 쉘은 명령어 해석기 또는 명령행 인터페이스를 의미한다. 쉘을 사용하는 것은 윈도우의 '명령 프롬프트'에서 명령을 실행하는 것과 유사하지만 리눅스의 쉘은 훨씬 강력한 기능을 제공한다. 쉘 명령은 GUI 도구로는 수행하기 어려운 다양한 고급 기능을 제공한다. 또한 쉘은 스크립트 언어이기도 하다. 쉘 명령어로 구성된 쉘 스크립트 프로그램을 작성하면 쉘이 스크립트 파일을 읽어 일련의 명령을 수행할 수 있다.

 

 

윈도우 명령 프롬프트 창

 

리눅스 콘솔 창

 

쉘은 운영체제의 일부이며 커널과는 분리된 프로그램이다. 쉘의 종류에 따라 alias 설정, 초기화 파일, 스크립트 작성 등에서 다른 특성을 가질 수 있다. 리눅스 사용자는 자신이 선호하는 쉘을 기본 쉘로 설정하여 사용할 수 있다.

 

쉘의 종류

리눅스 배포판 마다 여러 종류의 쉘이 제공되는데 CentOS를 비롯한 많은 리눅스 배포판에서 기본 쉘로 사용되는 것이 'bash(Bourne Again Shell) 쉘'이다. bash 쉘은 초기 유닉스 쉘인 'Bourne 쉘'과 호환되며 속도와 편의성을 개선한 GNU 무료 공개용 버전이다. 명령을 입력할 수 있는 라인 '명령 행'이라 하며 커서(_) 좌측 프롬프트 '명령 대기중'임을 표시한다. bash 쉘의 경우 기본 프롬프트 $이며 root  #이다.(이는 변경이 가능하다.)

 

명령 행 좌측에 프롬프트가 일반 사용자는 $, root는 #로 표시된다.

 

쉘 이름 실행 명령 설명
Bourne Shell sh 유닉스 초기부터 사용된 쉘로 대부분의 유닉스 계열 운영체제에서 지원한다. 많은 쉘 스크립트가 이에 기반을 두고 있다.
C Shell csh 스크립트 작성 형식이 C언어 구문과 비슷하며 BSD 계열의 유닉스 사용자들이 많이 사용했다. Bourne 쉘의 기능을 확장했다.
TC Shell tcsh C 쉘을 확장 개선한 버전으로 '명령 행 완성'과 '명령 행 편집' 기능이 추가됐다.
Korn Shell ksh 호환성을 유지하면서 Bourne 쉘을 확장하고 C 쉘의 많은 기능을 추가했다. System V 계열 유닉스 사용자들에게 인기가 많았다.
Bourne Again Shell(bash) bash 리눅스에서 가장 많이 사용되는 쉘이다. Bourne 쉘을 토대로 개발됐으며 C 쉘과 Korn 쉘의 유용한 기능을 가져왔다. GPL 라이센스를 따른다.

표 - 주요 쉘의 특징

 

이후 내용은 bash 쉘을 기준으로 한다.

 

쉘의 구분 - 로그인 쉘, 비 로그인 쉘, 서브 쉘

로그인 쉘

로그인 쉘은 로그인할 때 수행되는 기본 쉘이다. 로그인 쉘은 logout 명령으로 로그아웃하여 쉘을 종료할 수 있다.(비 로그인 쉘에서는 logout 명령을 사용할 수 없다.) 텍스트 모드에서 사용자 계정으로 로그인할 때 수행되는 쉘이 로그인 쉘이다. 또한 다른 사용자 계정으로 전환하는 su -l username 명령으로 수행되는 서브 쉘도 로그인 쉘이다. -l 옵션은 지정된 사용자의 로그인 쉘을 시작하는 옵션이다.

[user1@localhost ~]$ whoami
user1
[user1@localhost ~]$ su -l user2
Password:
[user2@localhost ~]$ whoami
user2
[user2@localhost ~]$ logout
[user1@localhost ~]$ 

 

su -l user2 명령으로 사용자 user2의 로그인 쉘을 실행하며 사용자를 전환한다. logout 명령으로 user2의 로그인 쉘을 종료하고 user1의 쉘로 돌아간다.

 

비 로그인 쉘

말그대로 로그인 쉘이 아닌 쉘이다. logout 명령이 아닌 exit 명령으로 쉘을 종료한다. GUI 환경(그래픽 모드)에서 터미널을 띄우면 수행되는 쉘이 비 로그인 쉘이다. 또한 다른 사용자 계정으로 전환하는 su username 명령으로 수행되는 서브 쉘도 비 로그인 쉘이다.

[user1@localhost ~]$ whoami
user1
[user1@localhost ~]$ su user2
Password:
[user2@localhost ~]$ whoami
user2
[user2@localhost ~]$ logout
[user2@localhost ~]$ bash: logout: not login shell: use 'exit'
[user2@localhost ~]$ exit
[user1@localhost ~]$ 

 

su user2 명령으로 사용자 user2로 단순 전환한다. 로그인 쉘을 실행하지 않으므로 관련된 초기화 스크립트가 실행되지 않고 단지 사용자만 전환된다. 로그인 쉘이 아니므로 logout으로 쉘을 종료할 수 없고 exit 명령으로 쉘을 종료한다.

 

서브 쉘

현재 쉘 안에서 실행되는 쉘이다. 현재 쉘의 자식 프로세스로 실행된다. exit 명령으로 서브 쉘을 종료하고 부모 쉘로 돌아간다. 서브 쉘은 부모 쉘의 환경 변수를 전달받아 공통적으로 사용할 수 있다. 예를 들어 현재 쉘에서 sh 명령으로 bourne 쉘을 실행할 수 있는데, 이렇게 실행된 쉘을 서브 쉘이라고 한다.

[user1@localhost ~]$ export FOO=bar
[user1@localhost ~]$ sh
sh-4.1$ echo $FOO
bar
sh-4.1$ exit
exit
[user1@localhost ~]$ unset FOO
[user1@localhost ~]$ echo $FOO
 
[user1@localhost ~]$ 

 

위와 같이 부모 쉘에서 만든 환경 변수 FOO가 서브 쉘에서도 사용할 수 있음을 확인할 수 있다.

 

※ [참고] 각 명령어의 의미

export FOO=bar : 문자열 bar를 갖는 환경 변수 FOO 만듦

sh : bourne 쉘을 서브 쉘로 실행

echo $FOO : 변수 FOO 값 출력

exit : 서브 쉘 종료

unset FOO : 변수 삭제

 

리눅스 기본(로그인) 쉘 확인

grep username /etc/password
[user1@localhost ~]$ grep user1 /etc/passwd
user1:x:502:502:General User:/home/user1/bin/bash

 

grep 계정명 /etc/passwd를 통해 해당 사용자의 기본 쉘을 확인할 수 있다. 결과의 마지막 항목인 /bin/bash가 user1 사용자의 기본 쉘이 bash임을 의미한다.

 

리눅스 기본(로그인) 쉘 변경 - chsh

chsh -s /bin/tcsh        # 현재 사용자의 기본 쉘을 tcsh로 변경
chsh -s /bin/tcsh user1  # user1의 기본 쉘을 tcsh로 변경
chsh -l                 # 사용 가능한 쉘 출력

대상 username이 생략되면 현재 로그인한 사용자를 대상으로 한다. 다른 사용자의 쉘을 바꾸려면 권한이 있어야 한다.

[user1@localhost ~]$ chsh -l
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh

 

사용 가능한 쉘 확인

 

옵션 내용
-l 사용 가능한 쉘을 나열(/etc/shells 파일 내용과 동일)
-s shell 로그인 쉘 변경
ex: chsh -s /bin/tcsh
-u 도움말(usage)

표 - chsh 명령어 옵션

 

관련 포스트

[OS/Unix·Linux] - 유닉스와 리눅스, GNU GPL 그리고 리눅스 배포판 종류

[OS/Unix·Linux] - 리눅스 파일 시스템 계층구조 표준(FHS: Filesystem Hierarchy Standard)

[OS/Unix·Linux] - 리눅스 쉘 명령어 기본 사항 정리

 

출처 : atoz-develop.tistory.com/entry/%EB%A6%AC%EB%88%85%EC%8A%A4-%EC%89%98-shell-%EC%9D%98-%EC%9D%B4%ED%95%B4?category=814444