이 2개의 bashrc 상호작용 검사의 차이점은 무엇입니까? [복사]

이 2개의 bashrc 상호작용 검사의 차이점은 무엇입니까? [복사]

(데비안 셸)에는 다음이 있습니다.

# 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~/.bashrcbash가 대화형 셸로 시작되지 않으면 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방법이 가장 안정적이고 이식성이 뛰어나므로 다른 방법을 사용할 이유가 없습니다.

관련 정보