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


36

나는 셸 스크립팅을 많이하지 않기 때문에 설명서를git submodule 읽을 때 약간 놀랐고이 설명서에서 사용 된 구문을 보았습니다.

서브 모듈의 명령에서 0이 아닌 리턴은 처리를 종료시킵니다. || :명령 끝에 추가 하여 이를 대체 할 수 있습니다 .

나는 || :명령이 성공적으로 종료되도록 강제하기위한 속기였습니다. 명령 종료를 성공적으로 수행해야 할 때마다을 사용했습니다 || true. 되어 || :더 관용적으로 간주?


||:(공간이없는) bash에서도 유효 하다는 점에 주목할 가치 가 있습니다. 이 같은 일을 || :하거나 || true.
Bruno Bronosky

답변:


38

trueBourne 쉘에 내장되지 않았습니다. :항상 있었다 (그것은 #소개 되기 전에 주석을 입력하는 방법 이었다).

이 유형 짧은 때문에 즉, 아마도 사람들이 선호하는 주된 이유입니다 :이상 true.

(대한 POSIX 쉘에서 또 다른 차이가 있습니다 bash만 POSIX 모드를) 동안 true일반 내장이 (심지어 내장 될 필요가 없습니다)이고, :A는 특수 내장. 이는 몇 가지 영향을 미치며 대부분이 특정 경우에는 영향을 미치지 않을 것입니다.

  • 경우 :명령 때문에 실패 리디렉션의 포함, 실패, 그 출구 쉘됩니다. 실제로 리디렉션을 전달하지 않으면 아마 차이가 없을 것입니다.:

    $ 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로 설정을 유지 value한 후 :하지의 경우, 반환 true:

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

또한주의 || true의 껍질에 작품 rccsh가족이 아닌을 || :(그러나 취소하지 않기 set -ecsh).

|| :와 동일하지 않습니다 :. 다른 방법 (즉, 이전 파이프 라인이 실패한 경우)을 의미 하거나 실행: 합니다.

set -e
false

때문에 출구로 쉘을 야기 set -e하고 false비 제로 (실패) 종료 상태가 있습니다. set -e효과가 취소 된 경우 반환 0이 아닌 종료 상태가 사용되는 명령 상태 에서 같은 :

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

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


5
&& :훌륭합니다, 이것에 대한 문서 나 추가 자료가 있습니까? Google은 이런 종류의 키워드를 찾으려고 노력하고 있습니다…
Ian Bytchek

5

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

|| : 더 관용적 인 것으로 간주?

나는 그것이 문맥에 근거한다고 생각한다 .

a return value또는 a condition가 항상 true 인 경우 true키워드 를 사용해야 합니다. 코드를보다 명확하게 만들고 시청자에게 true 값을 강조하고 싶다는 것을 알려줍니다 .

while true; do something

또는

<commnad>
RETURN_VALUE= $? || true

그리고 아무것도하지 않거나 NOP쉘에서 작업하려면 콜론을 사용해야합니다.:

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

또는

while conditon
do
    : # DO NOTHING HERE
done

5

이러한 응답의 대부분은의 가장 일반적인 사용을 해결하지 못합니다 :.

먼저,이 논의는 Bourne 쉘 ( sh) 파생물 이 아닌 다른 쉘과 관련이 없습니다 . 즉 모든 Bourne의 파생 껍질을 참조 말했다 true:같은 일을한다. 프로그래머 는 항상 내장되어 있지는 않았지만 항상 내장 된 것이기 때문에 항상 내장되어 있기 때문에 :대신에 대신 사용하도록 권장 되었습니다.true:true

:두 가지 용도로 사용됩니다. 의 동의어가 아니지만 #기능이 다릅니다. 에서 스크립트를 디버깅 할 때 사용되는 set -x#은 파서에 의해 삭제되고 완전히 무시되는 반면가있는 행 :은 구문 분석되고 평가됩니다. 이 -x줄 아래 에 표시되고 평가 후의 값이 표시 되므로 디버깅에 실제로 유용합니다 . 모드 print에서만 표시되는 명령문을 코드에 넣는 것과 같습니다 -x. :실제 코드이므로 부작용으로 인해 프로그램에 영향을 줄 수 있으므로 그 이후 의 값에주의하십시오 .


1
두 번째 용도는 무엇입니까?
Peter Mortensen
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.