Interactive vs Non-Interactive Shell

Shell 이 실행되는 환경을 두가지로 나누어 볼 수 있습니다. 사용자로 부터 프롬프트를 통해 직접 명령을 입력받아 실행시키는 interactive shell 과 작성한 스크립트 파일을 실행하는것과 같은 non-interative shell 입니다. history 확장이나 alias, job control 과 같은 기능은 기본적으로 interactive shell 에서 사용하기 위한 것으로 스크립트 파일을 실행할 때는 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 변수에 설정된 파일을 실행합니다.

Quiz

여러 개의 파일이 들어있는 디렉토리에서 작업을 하다가 파일이 새로 생성되었는데 어떤 파일이 새로 생성되었는지 알수가 없습니다. 새로 생성된 순서대로 파일들을 sort 해보면 좋겠는데 어떻게 하면 될까요?

ls 명령의 -lt 옵션을 사용하면 가장 최근에 수정, 생성된 파일 순으로 출력을 해줍니다.

$ ls -lt

파일 크기순으로 출력하고 싶으면 -lS 옵션을 사용하면 됩니다.

$ ls -lS