Interactive vs Non-Interactive Shell
Shell 이 실행되는 환경을 두가지로 나누어 볼 수 있습니다. 사용자로 부터 프롬프트를 통해 직접 명령을 입력받아 실행시키는 interactive shell 과 작성한 script 파일을 실행하는것과 같은 non-interative shell 입니다. history 확장이나 alias, job control 과 같은 기능은 기본적으로 interactive shell 에서 사용하기 위한 것으로 script 을 실행할 때는 disable 됩니다.
Interactive shell 인지 아닌지는 다음 명령을 통해서 알아볼 수 있습니다.
# '$-' 변수는 set 명령에 의해 설정돼있는 option flags 을 담고 있으며
# 'i' 는 interactive 를 의미합니다.
case $- in
*i*) echo interactive shell ;;
*) echo non-interactive shell ;;
esac
Script 실행시에는 alias 기능이 disable 됩니다.
사용자마다 다른 alias 설정을 가지고 있기 때문에 script 가 배포되어 실행될때 alias 적용이 된다면 오류가 발생할 수 있습니다. ( alias 는 설정할 경우 우선순위가 제일 높습니다. )
Script 실행시에는 history 확장이 disable 됩니다.
history 확장 기능은 interactive shell 에서 사용하기 위한 것으로 script 실행 시에는 기본적으로 disable 됩니다. history
builtin 명령도 사용할 수 없습니다.
Script 실행시에는 job control 이 disable 됩니다.
job control 도 interactive shell 에서 사용하기 위한 것으로 script 실행 시에는 disable 됩니다. 그렇다고 해서 &
메타문자를 이용해 background job 을 생성하지 못한다는건 아니고 다만 bg, fg, suspend 명령을 사용할 수 없습니다. 하지만 jobs, wait, disown 명령들은 사용할 수 있습니다.
Script 실행시에는 exec 명령이 실패하면 바로 종료됩니다.
프롬프트 상에서는 exec
명령이 실패하면 에러 메시지와 함께 다음 프롬프트가 뜨게되지만 script 실행시에는 바로 종료하게 됩니다.
시작시 실행하는 파일이 다르다.
Interactive shell 이 시작될때는 ~/.bashrc
를 실행하고 shell script 나 bash -c
로 시작하는 Non-Interactive shell 이 시작될때는 BASH_ENV 변수에 설정된 파일을 실행합니다.