Bash는 리눅스 셸의 전부가 아닙니다. 인기 있는 Zsh와 같은 다른 셸을 시도해 보는 것은 간단합니다. 마음에 드는 셸을 찾았다면, `chsh` 명령을 사용하여 기본 셸로 설정할 수 있습니다. 이제 그 방법을 알아보겠습니다.
셸이 중요한 이유
셸은 사용자와 운영 체제 사이에서 중요한 역할을 합니다. 명령을 입력하고 프로그램을 실행할 수 있는 터미널 창 내부의 환경을 제공합니다. 셸은 사용자의 입력을 해석하여 원하는 작업을 파악하고, 필요한 경우 외부 프로그램을 찾아 작업을 처리합니다.
리눅스에는 다양한 셸이 존재하며, 이들은 모두 파일 시스템 탐색, 파일 조작, 프로그램 실행, 스크립트 실행과 같은 핵심 기능을 수행합니다. 하지만 각 셸은 고유한 방식으로 이러한 작업을 처리하며, 다양한 특징과 기능을 제공합니다.
셸은 특정 사용자의 요구에 맞춰 설계되는 경향이 있습니다. 만약 여러분의 사고방식이 셸 디자이너의 의도와 일치한다면, 해당 셸은 여러분에게 최적의 선택이 될 것입니다. 또한, 리눅스에서는 새로운 셸을 자유롭게 시도해 볼 수 있습니다.
대부분의 리눅스 배포판, 특히 우분투에서는 bash가 기본 셸로 설정되어 있습니다. bash는 훌륭한 기능을 제공하지만, 다른 셸들은 여러분의 워크플로우를 크게 향상시킬 수 있는 다양한 편의 기능을 제공할 수 있습니다. 직접 경험해 보지 않으면 그 차이를 알 수 없습니다!
다양한 셸 살펴보기
다양한 리눅스 셸에 대해 간략하게 살펴보겠습니다.
- bash: Bourne Again Shell은 여러 배포판에서 기본 셸로 사용됩니다.
- rbash: 제한된 bash 셸로, 실행되는 사용자 또는 스크립트에 최소한의 기능만 제공합니다.
- ash: Almquist shell은 bash보다 가벼운 버전입니다.
- dash: Debian Almquist Shell은 우분투에서 기본 쉘 스크립트로 사용됩니다. bash는 기본 로그인 및 대화형 셸이지만, dash는 bash보다 훨씬 가볍기 때문에 시스템 프로세스를 실행하는 데 주로 사용됩니다.
- zsh: Z 셸은 bash 셸 제품군의 현대적인 재해석입니다. 명령 오타 수정 및 제안과 같은 편리한 기능을 제공합니다.
- fish: 사용자 친화적인 대화형 셸로, 처음부터 새로 작성되었으며 다른 셸 제품군에서 파생되지 않았습니다. 기록 및 현재 폴더 내용을 기반으로 명령에 대한 예측 텍스트 기능을 제공합니다.
- ksh: Korn shell은 특히 강력한 스크립팅 언어를 제공합니다.
설치된 셸 목록 확인
컴퓨터에 설치된 셸 목록을 확인하려면 다음 명령을 사용하세요. `/etc/shells` 파일의 내용을 표시합니다.
cat /etc/shells

앞서 bash, dash, rbash에 대해 언급했지만, sh는 무엇일까요?
sh는 Thompson 셸로, 1971년에 Ken Thompson이 벨 연구소에서 개발했습니다. 더 이상 유지보수되지 않으며, 현재는 최신 셸로 대체되었지만, 여전히 `#!/bin/sh`와 같은 오래된 스크립트와의 호환성을 위해 남아 있습니다.
#!/bin/sh
이 코드는 시스템에게 sh 셸을 사용하여 스크립트를 실행하도록 지시합니다. 그렇다면 컴퓨터에 실제로 오래된 셸이 존재하고 스크립트 실행에 사용되고 있을까요? `which` 명령을 사용하면 명령을 입력할 때 실제로 실행되는 프로그램을 확인할 수 있습니다.
sh를 입력하여 실행되는 내용을 살펴보겠습니다.
which sh
결과를 보면 바이너리를 찾은 것처럼 보입니다. 조금 더 자세히 살펴보면, 실제로는 스크립트 실행에 사용되는 경량 셸인 dash를 가리키는 심볼릭 링크임을 알 수 있습니다.
ls -l /bin/sh

이것은 최신 시스템에서 sh를 찾을 것으로 예상되는 스크립트를 위한 안전망을 제공하는 깔끔하고 가벼운 방법입니다.
다른 셸 설치하기
이제 Fish 셸을 설치하고 기본 셸로 설정해보겠습니다. 우분투에서는 다음 명령을 입력하세요.
sudo apt-get install fish

Manjaro에서는 pacman을 사용하세요.
sudo pacman -Sy fish

Fedora에서는 다음을 입력하세요.
sudo dnf install fish
설치가 완료되면 설치된 셸 목록을 다시 한 번 확인할 수 있습니다.
cat /etc/shells

새로운 셸은 `/usr/bin/fish`로 표시됩니다. 해당 경로를 잘 기억해 두세요. 곧 필요할 것입니다.
`$SHELL` 환경 변수
`$SHELL` 환경 변수는 현재 셸의 이름을 저장합니다. `echo` 명령을 사용하여 설정된 값을 확인할 수 있습니다.
echo $SHELL
이제 Fish 셸을 실행해 봅시다.
fish
다시 한번 `$SHELL` 환경 변수가 가리키는 내용을 확인해보겠습니다.
echo $SHELL

처음 `echo $SHELL`을 사용했을 때, 우리는 bash 셸에 있었습니다. 환경 변수에는 bash 실행 파일인 `/bin/bash`의 경로가 저장되어 있었습니다.
Fish 셸을 시작하면, 환영 메시지가 나타나고 명령 프롬프트가 변경됩니다. 하지만 놀랍게도 `$SHELL` 환경 변수는 여전히 bash 실행 파일인 `/bin/bash`의 경로를 가리키고 있습니다. 이는 정상적인 현상입니다.
새로운 셸이나 다른 프로그램을 시작하면, 상위 셸의 환경을 상속받습니다. 따라서 Fish 셸은 bash 셸에서 설정된 전역 및 내보낸 환경 변수를 상속받습니다. `$SHELL` 환경 변수의 값은 변경되지 않았으므로, bash 셸과 동일한 값을 Fish 셸에서도 갖게 됩니다.
우리는 Fish를 다른 프로그램과 마찬가지로 실행하고 있습니다. `exit` 명령을 사용하여 Fish 셸을 종료할 수도 있습니다. Fish 셸은 종료되고, 다시 bash 셸로 돌아갑니다.
이러한 방식으로 새로운 셸을 체험해보고, 어떤 기능을 제공하는지, 그리고 자신에게 맞는지 확인하는 것이 좋습니다. 바로 기본 셸로 설정하기 전에 충분히 탐색하고 적응할 시간을 갖는 것이 좋습니다.
Fish나 다른 셸을 기본 셸로 설정하려면, `chsh` 명령을 사용해야 합니다.
`chsh` 명령
`chsh` 명령은 기본 셸을 변경하는 데 사용됩니다. 중요한 점은, 기본 로그인 셸과 기본 대화형 셸을 모두 변경할 수 있다는 것입니다. 두 셸을 동일하게 설정하거나, 다르게 설정할 수 있습니다.
로그인 시 명령 프롬프트를 얻기 위해 사용되는 셸은 로그인 셸로 구성됩니다. 이미 로그인한 상태에서 터미널 창을 열 때 사용되는 셸은 대화형 셸로 구성됩니다. 이들은 동일한 셸일 수도 있고, 다른 셸일 수도 있습니다.
로그인 셸을 설정하려면 매개변수 없이 `chsh`를 사용하세요.
chsh

비밀번호를 입력하라는 메시지가 나타납니다. 그런 다음 새로운 셸의 경로를 입력하고 Enter 키를 누르세요.
다른 컴퓨터에서 이 테스트 컴퓨터에 원격으로 접속하는 경우, 로그인하면 Fish 셸이 실행됩니다.

대화형 셸을 변경하려면 `-s` (shell) 옵션과 함께 `chsh`를 사용하고, 명령줄에 새로운 셸의 경로를 전달합니다.
chsh -s /usr/bin/fish

암호를 묻는 메시지가 나타나고, 현재 셸의 명령 프롬프트로 돌아갑니다. 변경 사항을 적용하려면 로그아웃한 후 다시 로그인해야 합니다. 그러면 환영 메시지와 Fish 셸 명령 프롬프트가 표시됩니다.
`$SHELL` 환경 변수는 이제 새로운 기본 셸의 경로를 저장합니다.
echo $SHELL

다른 사용자 계정의 셸 변경
루트 권한이 있고 `sudo`를 사용할 수 있는 경우, 다른 사용자 계정의 셸을 변경할 수 있습니다. 명령은 이전과 동일하며, 단지 명령줄에 해당 사용자의 이름을 추가하면 됩니다.
sudo chsh -s /usr/bin/fish mary

다음번에 `mary` 계정으로 로그인하면, 터미널 창을 열 때 새로운 셸이 표시됩니다.
