명령을 사용하여 콘솔 설정을 인쇄하면 기본적으로 출력이 echo $-
설정됩니다 . himBHs
그러나 스크립트 파일에서 동일한 명령을 실행하면 hB
.
root@root:~# echo $-
himBHs
root@root:~# ./abc.sh
hB
root@root:~#
제가 알고 싶은 것은 /bin/bash
환경에서 스크립트를 실행하더라도 동일한 기본 설정이 적용되지 않는 이유는 무엇입니까?
예를 들어, 다음 명령을 사용하여 새로운 하위 쉘 프로세스를 시작할 때/bin/bash
콘솔에서설정을 나열하면 출력이 표시됩니다 himBHs
.
root@root:~# /bin/bash
root@root:~# echo $-
himBHs
내부에서 동일한 프로세스를 실행하려고 하면쉘 파일, 내가 얻는 출력은 "HB".
root@root:~# ./abc.sh
hB
Shebang을 사용하거나 사용하지 않고 동일한 프로세스를 시도했지만 스크립트 파일이 있거나 실행 bash script_file
하면 동일한 결과( )가 나타납니다../script_file
hB
내가 무엇을 놓치고 있나요?
답변1
스크립트를 실행할 때 상위 셸(명령을 실행하는 셸)은 스크립트를 실행하기 위해 비대화형 셸을 시작합니다. 이 셸에는 대화형 플래그가 비활성화되고 i
두 가지 옵션만 켜져 있습니다.
-h
실행할 명령을 찾을 때 (해시) 명령을 찾아서 기억하세요.-B
쉘이 중괄호 확장을 수행하도록 허용
set
출력에 표시되는 전체 옵션 목록을 볼 수 있습니다 $-
.내장 컬렉션
-i
셸이 대화형 모드에서 실행되도록 지시하는 대화형 셸에서 사용할 수 있는 추가 옵션
-m
작업 제어 허용-H
!
스타일 기록 교체 활성화
답변2
Bash가 POSIX 모드에서 대화식으로 실행되는지 여부에 따라 기본적으로 여러 설정이 활성화(또는 비활성화)됩니다. 예를 들어 출력에서 다음과 같습니다 help set
.
-H Enable ! style history substitution. This flag is on
by default when the shell is interactive.
또는:
-p Turned on whenever the real and effective user ids do not match.
공교롭게도 Bash의 POSIX가 아닌 대화형 모드의 경우 활성화된 옵션은 다음과 같습니다 himBHs
( -i
대화형 모드의 경우 -s
표준 입력에서 명령을 읽기 위한 다른 옵션은 에 나열되어 있습니다 help set
).