Bash 스크립트에서 `|| true` 또는 `|| 중 어느 것이 더 관용적입니까?

Bash 스크립트에서 `|| true` 또는 `|| 중 어느 것이 더 관용적입니까?

나는 쉘 스크립팅을 많이 하지 않기 때문에 읽으면서 조금 놀랐습니다.선적 서류 비치git submodule이 문서에서 그들이 사용하는 구문을 보았습니다.

하위 모듈의 명령에서 0이 아닌 반환이 발생하면 처리가 종료됩니다. 이는 || :명령 끝에 추가하여 재정의할 수 있습니다.

|| :명령을 강제로 성공적으로 종료하기 위한 약칭으로 이것을 찾아야 했습니다 . 명령을 성공적으로 종료해야 할 때마다 를 사용합니다 || true. || :이것이 더 관용적인 것으로 간주됩니까?

답변1

trueBourne 쉘에 내장되어 있지 않습니다. 항상 그래왔습니다(이것은 이전에 소개된 :댓글 입력 방식이었습니다).#

그리고 타이핑 시간이 짧기 때문에 사람들이 :선호하는 것일 수도 있습니다 true.

POSIX 셸의 또 다른 차이점에 유의하세요( 의 경우 bashPOSIX 모드에서만). while 은 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 :after return 으로 설정됩니다 .varvalue:true

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

또한 || true일련의 쉘에서 작동할 수 있지만 취소할 수는 없습니다.rccsh|| :set -ecsh

|| :와 같지 않음을 :의미합니다.또는 :달리 실행(즉, 이전 파이프라인이 실패한 경우)

set -e
false

0이 아닌(실패) 종료 상태 set -e(옵션이라고도 함 )로 인해 쉘이 errexit종료되도록 합니다. 0이 아닌 종료 상태를 반환하는 명령이 다음과 같이 사용되는 false경우set -e상황그림:

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

false && :취소만 가능합니다 set -e. 취소 하고 종료 상태를 다음으로 설정하는 false || :효과 따라서 더 관용적으로 말하면 명령의 실패한 종료 코드를 무시하려고 합니다. 대부분의 사람들은 이것이 더 명확하다고 생각합니다 (의도를 더 명확하게 전달).set -e0|| true

답변2

이러한 응답의 대부분은 해결에 실패합니다 :.

첫째, 이 논의는 쉘이 아닌 어떤 것과도 관련이 없습니다.본 쉘( sh) 파생상품. 즉, 모든 Bourne 파생 쉘은 true:를 동일한 것으로 취급합니다. 프로그래머는 항상 내장되어 있기 때문에 :대신 사용하도록 권장되었지만 과거에는 어떤 경우에는 항상 내장되지 않았습니다 .true:true

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

답변3

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

|| :가 더 관용적이라고 생각되나요?

나는 이것이 기반이라고 생각한다.문맥.

return valuea 또는 a가 항상 참이 되도록 하려면 키워드를 condition사용해야 합니다. 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

관련 정보