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 변수에 설정된 파일을 실행합니다.