bash 스크립트에서 더 관용적입니다.`|| true` 또는`|| :`?

쉘 스크립팅을별로하지 않아서 을 읽을 때 조금 놀랐습니다. git submodule 에 대한 문서와이 문서에서 사용한 구문을 확인했습니다.

A 하위 모듈의 명령에서 0이 아닌 값을 반환하면 처리가 종료됩니다. 명령 끝에 || :를 추가하여 무시할 수 있습니다.

|| :는 명령이 성공적으로 종료되도록하는 약어라는 것을 찾아야했습니다. 명령을 성공적으로 종료해야 할 때마다 , 저는 || true를 사용했습니다. || :가 더 관용적 인 것으로 간주 되나요?

댓글

  • 그것 '는 ||: (공백 없음)가 bash에서도 유효하다는 점에 주목할 가치가 있습니다. || : 또는 || true와 동일한 작업을 수행합니다.

Answer

true는 Bourne 셸에 내장되지 않았습니다. :는 항상 그렇습니다 (#가 도입되기 전에 주석을 입력하는 방법).

그 이유는 입력하는 것이 더 짧기 때문에 사람들이 true보다 :를 선호하는 주된 이유 일 것입니다.

다른 차이점에 유의하세요. POSIX 쉘 (bash의 경우 POSIX 모드에서만) : 반면 true는 일반 내장 (내장 할 필요도 없음)입니다. , : 특별한 내장입니다. 여기에는 몇 가지 의미가 있으며 대부분은이 특정 경우에 영향을 미치지 않을 것입니다.

  • : 명령이 실패하면 실패한 리디렉션으로 인해 쉘이 종료됩니다. 실제로는 리디렉션을 :

    $ sh -c ": > / ; echo HERE" sh: 1: cannot create /: Is a directory $ sh -c "true > /; echo HERE" sh: 1: cannot create /: Is a directory HERE 
  • var=value :에서 var는 iv id = 이후 value로 설정됩니다. “2e9c356ccf”>

true의 경우가 아닌 반환 :

$ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1 

또한 || truerccsh의 셸에서 작동합니다. 가족이지만 || :가 아닙니다 (그러나 csh에서 set -e를 취소하지 않음).

|| ::와 다릅니다. 또는 실행 : 그렇지 않으면 (즉, 이전 파이프 라인이 실패하는 경우)

set -e false 

set -e (일명 errexit 옵션) 및 의 종료 상태가 0이 아닙니다 (실패). 0이 아닌 종료 상태를 반환하는 명령이 다음과 같은 조건 으로 사용되면 set -e 효과가 취소됩니다.

if false; then ... while false; do ... false && : ... false || : ... 

false && :set -e 만 취소합니다. false || :set -e의 효과를 취소하고 종료 상태를 0로 설정하므로 더 관용적입니다. 명령의 실패 종료 코드를 무시하고 싶다고 말합니다. 대부분의 사람들은 || true가 더 읽기 쉽다고 주장합니다 (의도를 더 명확하게 전달).

댓글

  • && :는 훌륭합니다. 이에 대한 문서 나 추가 자료가 있습니까? Google은 이런 종류의 키워드를 찾으려고하는데 부족합니다…

답변

대부분의 응답은 :의 가장 일반적인 사용을 해결합니다.

먼저,이 토론은 Bourne shell (sh) 파생. 즉, 모든 Bourne 파생 쉘은 true:를 동일한 것으로 간주합니다. 프로그래머는 true 대신 :를 사용하는 것이 좋습니다. :는 항상 이전에는 true가 항상 내장 된 것이 아니었던 경우가있었습니다.

:에는 두 가지 용도. #의 동의어는 아니지만 기능이 다릅니다. set -x에서 스크립트를 디버깅 할 때 #가 사용 된 줄은 파서에 의해 삭제되고 완전히 무시되지만

는 구문 분석되고 평가됩니다. 이는 -x 아래에 해당 줄이 표시되고 평가 후 해당 값이 표시되므로 디버깅에 매우 유용합니다.이는 -x 모드에서만 표시되는 print 문을 코드에 넣는 것과 같습니다. : 뒤의 값은 실제 코드이고 부작용이 프로그램에 영향을 미칠 수 있으므로주의하세요.

댓글

  • 두 번째 용도는 무엇입니까?

답변

일반적으로 bash에서는 콜론 :true는 동일합니다.

Is | | : 더 관용적이라고 생각하십니까?

문맥 .

return value를 원하거나 condition가 항상 true 인 경우 , true 키워드를 사용해야합니다. 그러면 코드가 더 명확 해지고 시청자에게 가치를 강조하고 싶다는 것을 알릴 수 있습니다. true , 즉 :

while true; do something 

또는

<commnad> RETURN_VALUE= $? || true 

아무것도하지 않으려면 또는 NOP 셸에서는 콜론 :

if condition then : # DO NOTHING HERE else do something fi 

또는

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다