개요
2023.09.13 - [Shell Script] 대화형 VS 비대화형 쉘에서 쉘의 종류를 대화형과 비대화형으로 구분해 봤는데, 이 글에서는 관점을 달리하여 Login Shell과 Non-Login Shell로 쉘의 실행 환경을 구분해 본다.
Login Shell
Login Shell은 원격 서버에 SSH나 Telnet으로 접속해 login 과정을 거쳐 사용하는 환경이다. 프롬프트 상에서 아래 명령을 실행했을 때, 첫 문자가 '-'이면 로그인 쉘임을 나타낸다.
echo $0
또는 아래 명령을 통해 알아볼 수 있다.
shopt -q login_shell; echo $?
# -q : 나열된 옵션이 모두 활성화되어 있으면 0을 반환한다.
Login Shell을 시작할 때는 아래의 파일을 순서대로 읽어 들인다.
/etc/profile -> ~/.bash_profile -> ~/.bash_login -> ~/.profile
# /etc/profile : . (source) 명령으로 /etc/bash.bashrc을 읽어들인다.
# ~/.profile : . (source) 명령으로 ~/.bashrc을 읽어들인다.
.bash_profile과 .profile은 sh와 bash를 구분하기 위해 별도로 존재한다. 가령 bash를 사용할 때 .bash_profile이 존재하면 .profile은 실행되지 않는다.
logout / exit 시, ~/.bash_logout 파일을 실행하며 logout 내장 명령을 사용할 수 있다.
Non-Login Shell
Non-Login Shell은 윈도우 매니저에서 메뉴로 제공하는 터미널 프로그램을 실행시켜 사용한다.
Non-Login Shell을 시작할 때는 아래의 파일을 읽어 들인다.
/etc/bash.bashrc -> ~/.bashrc
❗ .rc의 유래
1965년 MIT Compatible Time-Sharing System (CTSS)에 하나의 파일에 여러 명령을 넣어두고 실행하는 기능인 runcom이 존재했다. runcom은 run commands를 뜻했는데, 이 앞글자를 따서 rc 파일이 되었다.
Non-Login Shell에서도 아래 명령을 통해 Login Shell을 만들 수 있다.
bash -l
sh -l
sudo
su
Real user id vs Effective user id
Real user id : 시스템에 로그인했을 때의 ID. readonly 환경변수 $UID에 저장된다.
Effective user id : SET UID가 설정된 프로그램을 실행했을 때 변경된다. readonly 환경변수 $EUID에 저장되며, $EUID는 명령을 실행할 때의 실질적인 권한에 해당한다.
.bashrc.d
사용자가 직접 생성한 함수, Alias, 자동완성 등은 ~/.bashrc.d 디렉터리를 생성하여 관리하면 좋다. .bashrc에서 사용하는 파일이 위치하는 디렉터리라는 뜻으로 .d를 붙인다. ~/.bashrc에는 ~/.bashrc.d 아래의 파일들을 읽어 들이도록 아래 내용을 추가해야 한다.
# alias 설정 읽어들이기
for file in ~/.bashrc.d/aliases/*.sh
do
source "$file"
done
# 함수 설정 읽어들이기
for file in ~/.bashrc.d/functions/*.sh
do
source "$file"
done
# 자동완성 설정 읽어들이기
for file in ~/.bashrc.d/completions/*.sh
do
source "$file"
done
unset -v file
참고 문서
https://mug896.github.io/bash-shell/login_non-login.html
https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html