Linux/Shell Script

[Shell Script] 대화형 VS 비대화형 쉘

비번변경 2023. 9. 13. 22:09

쉘 실행 환경

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