(데비안 셸)에는 다음이 있습니다.
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
다른 (데비안 셸)에는 다음이 있습니다.
# If not running interactively, don't do anything
[ -z "$PS1" ] && return
그들 사이의 차이점은 무엇입니까? 이제 어느 것을 선택해야 할까요?
답변1
i
특수 매개변수의 test for는 $-
현재 쉘이 대화형 쉘로 시작되는지 여부를 테스트합니다.
$PS1
(기본 프롬프트 문자열)이 비어 있는지(대부분의 경우) 테스트는 다음과 같은 이유로 예기치 않은 쉘 상호 작용을 감지하기 위해 bash 쉘(및 해당 쉘만)에서 사용될 수도 있습니다.
$PS1
~/.bashrc
bash가 대화형 셸로 시작되지 않으면 bash가 여전히 읽고 있는 경우에도 (예: 기본이 아닌 일부 bash 버전에서 소스를ssh
다시 시작하거나 명시적으로 가져올 때) 환경에서 a를 무시합니다 .~/.bashrc
$PS1
대화형 호출에서는 환경에 없는 경우 로bash
설정됩니다 .$PS1
"\s-\v\$ "
따라서 에서는 bash
일반적 $PS1
으로 대화형일 때 설정되고 비대화형일 때는 설정되지 않습니다.
$BASH_ENV
그러나 설정된 파일이 있거나 $PS1
( $BASH_ENV
비대화형 호출로도 파일이 해석되기 때문에), $PS1
환경에 null 값이 있거나, ~/.bashrc
이후 비대화형 쉘에서 얻은 경우 이 핵은 실패합니다. 설정되었습니다. PS1
이유 또는 기타(예: /etc/profile
비대화형 로그인 셸을 통해), 이 모든 것이 실제로는 불가능할 것입니다.
Korn과 유사한 쉘(ksh88, ksh93, pdksh, mksh, oksh, bash, zsh...)에서는 [[ $- = *i* ]]
or 를 수행할 수도 있습니다 [[ -o interactive ]]
(후자는 해당되지 않음 bash
).
하지만 이 case $- in (*i*)...; esac
방법이 가장 안정적이고 이식성이 뛰어나므로 다른 방법을 사용할 이유가 없습니다.