개인/리눅스

리눅스 쉘의 종류와 bash 쉘 기능

OmeGa2 2020. 1. 26. 18:40

쉘 (Shell)이란

해석 프로그램이라고도 불리는 쉘은 운영체제의 기능이나 서비스를 구현할 수 있는 명령어를 사용자에게 받아서 실행할 수 있는 인터페이스를 제공합니다. 결론적으로 사용자의 명령어를 실행해주는 프로그램 즉, 사용자와 운영체제의 다리 역할을 합니다.

 

사용자는 시스템에 로그인할 때 설정된 쉘을 부여받습니다. 쉘은 명령어로 이루어지는 CLI 와 아이콘으로 되어있는 GUI 기반으로 나뉘는데요. 사용자의 용도에 따라 숙련된 관리자의 경우 CLI 가 편할 수도 있고 초보나 일반적인 사용의 경우 GUI 이 편할 수도 있으니 둘 중 뭐가 더 좋다 라고 따지는 것은 사실상 무의미합니다.

(GUI : 그래픽 사용자 인터페이스 / CLI : 명령 줄 인터페이스(텍스트))

 

 

많이 사용하는 쉘의 종류

현재 사용되는 쉘의 종류로는 유닉스버전의 기본 쉘인 본 쉘 (Bourne shell) 이후 C쉘, 배쉬 쉘 등 다양한 종류가 있습니다. 하지만 굳의 쉘의 종류와 사용법 등을 너무 자세히 알아야 될 필요는 없다고 생각합니다. 만약 자격증 시험을 준비하고 있는 분이 계신다면 간단하게 어떤 쉘이 있는지 종류를 구분할 수 있고 개발자와 간단한 특징 정도만 알아도 충분할 거라 생각합니다. 

 

 

본 쉘 / C쉘 두 가지만 명령행 편집 기능이 없습니다. 이후 C쉘을 기반으로 개발된 tcsh부터 명령행 편집, 자동완성 등 여러 기능이 추가되었으며 현재는 리눅스에서 bash쉘을 표준으로 사용하고 있습니다.  

(개발된 순서 : 본쉘 → C쉘 → tcsh → ksh → bash쉘)

 

 

 

리눅스에서 쉘을 확인하려면?

로그인 후 자동 설정되어 사용 중인 쉘은 환경변수를 통해 확인할 수 있습니다.  환경변수를 확인하는 명령어로는 env / printenv가 있으며 그중 사용 중인 쉘을 보려면 SHELL을 확인해야 합니다. 환경변수의 종류가 많아 한번에 찾기 힘들다면 "echo $<환경변수명>"을 틍해 특정 변수만 확인할 수 있습니다. 또한 특정 사용자의 쉘을 확인하고 싶다면 /etc/passwd의 마지막필드를 통해 계정마다 로그인 시 자동으로 설정되는 기본 쉘을 확인할 수 있습니다.

 

사용 중인 쉘을 바꾸기 위해선 chsh명령을 사용합니다.

chsh -l 명령이나 cat /etc/shells 명령으로 바꿀 수 있는 쉘의 목록을 확인할 수 있으며 두 명령어는 동일합니다.

(chsh -l 명령은 /etc/shells의 내용을 출력해주는 명령입니다.)

chsh 명령 입력시 사용자의 비밀번호를 요구하며 변경하고 싶은 쉘의 절대 경로를 입력해 바꿀 수 있습니다. 바뀐 쉘은 다음 로그인부터 적용되며 /etc/passwd파일을 통해 사용자의 쉘이 변경된 것을 확인할 수 있습니다.

 

echo $SHELL = 사용중인 쉘 확인
chsh -l / cat /etc/shells = 사용할 수 있는 쉘 확인
chsh = 쉘 변경시 사용하는 명령어
/etc/passwd = 사용자의 로그인 쉘 확인

 

 

 

 

 

bash 쉘의 기본적인 기능은 뭐가 있을까?

리눅스의 표준으로 사용되는 bash쉘은 사용자에게 편의를 제공하는 명령행 자동완성 및 편집 등 다양한 기능을 가지고 있으며 GNU프로젝트에서 개발되어 리눅스 뿐만 아니라 다양한 OS에서 사용되고 있습니다. 따라서 bash쉘을 다루는 방법을 알고있다면 여러모로 도움이 될거라 생각합니다.

 

 

  • 명령행 자동완성 기능

리눅스에서 가장 많이 사용되는 기능 중 하나입니다.

리눅스에서 작업하는 도중 특정 파일이나 디렉토리명이 너무 길어서 기억나지 않을 때 첫 글자 몇 개만 입력한 뒤 Tab키를 누르면 해당 글자로 시작되는 파일명이 자동으로 완성됩니다. 만약 해당 글자가 포함되는 파일이 여러 개 있는 경우 tab를 두 번 눌러 그 목록을 확인할 수 있습니다. 

 

작업자가 모든 파일과 디렉토리명을 외우고 있기에는 무리가 있습니다. 파일을 찾을 때 이리저리 들어가 보고 ls 명령을 사용해야 하는 번거로움은 상당히 귀찮은 일이 되는데요. 명령행 자동완성은 명령어 사용 도중 파일이 기억나지 않을 때 많은 도움을 줄 수 있습니다.

 

 

  • history 기능

C쉘이나 ksh 등 여러 쉘이 가지고 있는 기본적인 기능 중 하나입니다.

실행했던 명령어가 히스토리 리스트에 저장되어 같은 명령어를 여러 번 사용해야 할 때 매번 입력해야 하는 번거로움을 줄여 줄 수 있습니다. 방향키 위, 아래로 이전에 사용했던 명령어를 볼 수 있으며 history 명령어 입력 시 사용자가 입력했던 명령어 중 일부 (설정된 값에 따라)를 확인할 수 있습니다.

 

히스토리 관련 환경변수로 최대 저장되는 명령어의 개수나 파일크기, 위치 등을 확인할 수 있습니다. 각 환경변수는 echo $<변수명>으로 확인 가능하며 echo $HISTSIZE 명령으로 최대 저장되는 명령어의 개수를 볼 수 있습니다.

 

 

 

 

  • alias (별칭) 기능

자주 사용하는 특정 명령어가 길어서 매번 입력하기 번거로울 때 유용합니다.

특정 명령어에게 별명을 지정해서 별명을 입력했을 때 명령어가 실행되도록 만들어주는 기능으로 예를 들어 cat /var/log/messages 명령어에게 A라는 별명을 지어준다면, A를 입력했을 때 cat /var/log/messages가 실행됩니다.

 

"alias [별명='명령어']"로 간단하게 지정할 수 있고 명령어는 작은따옴표 (' ')로 묶어줘야 합니다.  "unalias 별명"으로 해제할 수 있습니다.  지정되어 있는 명령어는 alias 명령으로 확인할 수 있으며 같은 명령어를 여러 번 사용하며 확인해야 되는 경우 유용하게 사용할 수 있습니다.

 

]# alias A='cat file' : A입력시 file의 내용 확인
]# alias                : 설정된 명령어 확인      
]# unalias A          : A로 설정된 명령어 해제

 

 

 

 

  • 명령행 편집 기능

명령어를 입력하는 도중 커서 이동이나 삭제 등을 빠르게 할 수 있는 기능을 말합니다. 하지만  대부분의 사용자들은 backspace로 모두 지우고 수정하면 되는 부분이기 때문에 명령행 편집은 사실 그렇게 자주 쓰이는 기능은 아니라고 생각합니다.  그래도 알아두면 괜찮다고 생각되는 기능 4가지만 소개하겠습니다.

 

 

 

 

 

 

리다이렉션 (< , >)

프로세스의 표준 입/출력 제어라고 불리는 리다이렉션은 입/출력의 방향을 바꾸기 위해 사용되며, 보통 명령어의 출력 결과를 모니터가 아닌 파일로 변경할 때 사용합니다. 특정 명령어의 출력을 다른 파일에 저장하고 싶을 때, 화면에 출력된 내용을 복사해서 다른 파일을 만들어 붙여 넣기 해야 하는 번거로움을 한 번에 해결해주는 명령입니다.

 

> , >> : 왼쪽을 바라보는 리다이렉션은 출력 제어를 담당합니다.

< , << : 오른쪽을 바라보는 리다이렉션은 입력 제어를 담당합니다.

 

"[명령어] > [파일명]" 이처럼 > 하나로 이루어진 출력 제어는 명령어의 출력을 모니터 -> 파일로 변경해서 출력하게 되고 파일이 없을 경우 파일을 생성합니다. 만약 파일이 있을 경우 기존 내용을 삭제하고 덮어쓰기 합니다. 만약 기존 파일 내용 아래에 추가하고 싶다면 "[명령어] >> [파일명]" 이처럼 두 개를 사용하면 됩니다.

입력 제어인 "< , <<"도 출력 제어와 비슷한 개념입니다.

 

[명령어] > [파일명] : 출력 변경(모니터 -> 파일) 덮어쓰기
[명령어] >> [파일명] : 출력 변경 (모니터-> 파일) 아래 추가

 

파이프라인 ( | )

Backspace 키 주변의 "\" 표시를 [Shift + \] 형식으로 사용할 수 있는 | (파이프라인)은 리눅스에서 표준 출력을 다른 프로세스의 입력으로 바꾸는데 주로 사용합니다. 여러 개의 명령을 중복해서 사용하거나, 특정 파일의 내용을 다르게 보고 싶다거나 일부분만 따로 저장하고 싶을 때 유용하게 사용할 수 있습니다.

"[com1] | [com2] | [com3]" 이처럼 중복해서 사용할 수도 있으며 com3에는 com2의 출력을 입력으로 사용합니다.

 

 ex)

]# cat com1

가 = aaa

니 = bbb

다 = ccc

가 = ddd

 

(파이프라인 1회)

]# cat com1 | grep "가" 

가 = aaa

가 = ddd

 

(파이프라인 2회)

]# cat com1 | grep "가" | grep "d"

가 = ddd

 

]# cat com1 | grep "가" | grep "d" > com2

 

]# cat com1

가 = aaa

니 = bbb

다 = ccc

가 = ddd

]# cat com2

가 = ddd

 

 

파이프라인 2회 차에는 파일의 원본 (com1)이 아닌 1회 차에서 출력된 내용을 다루게 됩니다. 이처럼 복잡한 파일의 내용을 여러 번 필터를 거쳐 간단하게 바꾼다는 생각으로 사용하며, 파일의 내용 중 보고 싶은 부분만 골라내고 싶을 때 자주 사용합니다. 마지막에 리다이렉션을 이용해 해당 부분만 다른 파일로 저장하게 되면서 파일을 관리하는데 많은 도움이 됩니다.

 

 

bash쉘 관련 파일

사용자가 지정한 alias(별칭)이나 환경변수는 일시적으로 사용가능하며 다음 로그인시에는 사용할 수 없습니다.  따라서로그인할 때마다 새로 설정을 해야하는 번거로움이 있습니다. 만약 지속적으로 사용하고싶다면 관련 설정파일을 수정해서 로그인할 때 마다 자동으로 설정되도록 할 수 있습니다. bash 쉘에서는 개인사용자 관련 환경설정이나 로그인 시 읽어들이는 파일을 따로 저장하고 있습니다. 설정되는 파일의 위치는 아래와 같습니다.

 

환경변수나 시작프로그램에 관한 설정은 profile에서 확인하며 alias(별칭)에 관한 설정은 bashrc에서 확인합니다. 관리자는 /etc/profile에서 모든 사용자의 환경변수를 관리할 수 있으며 제한된 프로그램을 제공할 수 있습니다.