POSIX 셸에서 .
특수 내장 기능이므로 셸이 실패하면 셸이 종료됩니다 (와 같은 일부 셸 bash
에서는 POSIX 모드에서만 수행됨).
오류로 규정되는 것은 쉘에 따라 다릅니다. 파일을 구문 분석 할 때 구문 오류로 인해 모두 종료되는 것은 아니지만 소스 파일을 찾거나 열 수 없으면 대부분 종료됩니다. 소스 파일의 마지막 명령이 0이 아닌 종료 상태로 반환 된 경우 종료되는 errexit
옵션을 알 수 없습니다 ( 옵션이 물론 그렇지 않은 경우 ).
여기에 :
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
파일이있는 경우 소스를 원하고 그렇지 않은 경우 (또는 여기에 비어있는 경우)하지 마십시오 -s
.
즉, 파일이 없으면 오류 (POSIX 셸에서 치명적인 오류)로 간주되어서는 안되며 해당 파일은 선택적 파일로 간주됩니다.
파일을 읽을 수 없거나 디렉토리 인 경우 (치명적) 오류이거나 구문 분석 중에 구문 오류가있는 경우보고해야하는 실제 오류 조건 일 수 있습니다 (치명적).
경쟁 조건이 있다고 주장하는 사람들도 있습니다. 그러나 그 의미 유일한 것은 파일이 사이에서 제거되는 경우 쉘이 오류로 종료 것이 될 것이다 [
그리고 .
,하지만 난 그게 스크립트가있는 동안이 고정 경로 파일이 사라지고 갑자기 것이라고하면 오류를 고려하는 것이 유효의 주장 것 달리는.
반면에
command . "$NVM_DIR/nvm.sh" 2> /dev/null
여기서 command
¹는 명령에 대한 특수 속성을 제거 .
하므로 (오류시 쉘을 종료하지 않음) 다음과 같이 작동하지 않습니다.
.
의 오류를 숨길 뿐만 아니라 소스 파일에서 실행되는 명령의 오류도
- 또한 잘못된 권한을 가진 파일과 같은 실제 오류 조건을 숨길 수 있습니다.
다른 일반적인 구문 (예를 들어 grep -r /etc/default /etc/init*
, systemd
아직 변환되지 않은 init 스크립트에 대해서는 데비안 시스템 참조) ( EnvironmentFile=-/etc/default/service
옵션 환경 파일을 대신 지정하는 데 사용) :
[ -e "$file" ] && . "$file"
파일이 있는지 확인하고 비어 있으면 소스를 지정하십시오. 열 수없는 경우에도 여전히 치명적인 오류가 있습니다 (있는 경우 또는 거기에 있더라도). [ -f "$file" ]
(존재하고 일반 파일 임), [ -r "$file" ]
(읽기 가능) 또는 이들의 조합 과 같은 더 많은 변형을 볼 수 있습니다 .
[ ! -e "$file" ] || . "$file"
약간 더 나은 버전. 존재하지 않는 파일이 정상임을 분명히합니다. 이는 또한 $?
마지막에 실행 된 명령의 종료 상태를 반영 한다는 것을 의미합니다 $file
(이전의 경우, 이 명령이 존재하지 않았는지 또는 해당 명령이 실패 1
했는지 여부를 알 수 없음 $file
).
command . "$file"
파일이있을 것으로 예상하지만 해석 할 수 없으면 종료하지 마십시오.
[ ! -e "$file" ] || command . "$file"
위의 조합 : 파일이 없으면 OK이며 POSIX 쉘의 경우 파일을 열거 나 구문 분석하는 데 실패했지만 치명적이지는 않습니다 (더 바람직합니다 ~/.profile
).
¹ 참고 : zsh
그러나 에뮬레이션 command
이 없으면 그렇게 사용할 수 없습니다 sh
. Korn 쉘에서 source
실제로는 command .
특수한 변형이 아닌에 대한 별칭 입니다..