쉘 실행 환경
Shell이 실행되는 환경은 크게 두 가지로 구분할 수 있다.
- 대화형 (Interactive) : 프롬포트를 통해 사용자로부터 직접 명령을 입력받아 실행한다.
- 비대화형 (Non-Interactive) : 스크립트 파일 등을 실행한다.
history, alias, job control과 같은 기능은 기본적으로 대화형 쉘에서 사용하기 위한 기능이므로 비대화형 쉘에서는 비활성화된다.
쉘 실행 환경 확인
아래 명령을 통해 실행 중인 쉘이 대화형인지, 비대화형인지 확인할 수 있다.
case $- in
*i*) echo interactive shell ;;
*) echo non-interactive shell ;;
esac
set 명령에 의해 설정된 option flags를 저장하고 있는 $- 변수의 값에 대화형 쉘임을 나타내는 i가 포함되어 있는지 확인하는 명령이다.
예시로 대화형/비대화형 환경에서의 $- 값을 출력해 보면 아래와 같다.
대화형
echo $-
비대화형
비대화형 쉘의 특징
스크립트 등을 실행하는 비대화형 쉘의 특징은 다음과 같다.
1. alias 기능 비활성화
alias 설정은 사용자마다 다르다. 스크립트 실행 시 alias 기능이 적용되면 오류가 발생할 수 있기 때문에 비활성화된다.
2. history 확장 기능 비활성화
history 확장은 대화형 쉘에서 사용하기 위함으로, 비대화형 쉘에서는 history에 내장된 명령도 사용할 수 없다.
3. job control 비활성화
job control도 대화형 쉘에서 사용하기 위한 기능이다. 메타문자 &를 이용해 백그라운드 작업은 생성할 수 있지만 bg, fg, suspend 명령은 사용할 수 없다. 다만 jobs, wait, disown 등의 명령은 사용할 수 있다.
4. exec 명령 실패 시 종료
대화형 쉘에서는 exec 명령이 실패하면 에러 메세지가 표시되지만 비대화형 쉘에서는 바로 종료된다.
5. 실행 파일의 차이
대화형 쉘은 시작할 때 ~/.bashrc를 실행한다. 반명 비대화형 쉘은 시작할 때 BASH_ENV 변수에 설정된 파일을 실행한다. BASH_ENV 기본값은 따로 지정되어 있지 않는 것 같다.
참고 문서
https://mug896.github.io/bash-shell/interactive_non-interactive.html
https://stackoverflow.com/questions/42757236/what-does-mean-in-bash