나는 쉘 스크립팅을 많이 하지 않기 때문에 읽으면서 조금 놀랐습니다.선적 서류 비치git submodule
이 문서에서 그들이 사용하는 구문을 보았습니다.
하위 모듈의 명령에서 0이 아닌 반환이 발생하면 처리가 종료됩니다. 이는
|| :
명령 끝에 추가하여 재정의할 수 있습니다.
|| :
명령을 강제로 성공적으로 종료하기 위한 약칭으로 이것을 찾아야 했습니다 . 명령을 성공적으로 종료해야 할 때마다 를 사용합니다 || true
. || :
이것이 더 관용적인 것으로 간주됩니까?
답변1
true
Bourne 쉘에 내장되어 있지 않습니다. 항상 그래왔습니다(이것은 이전에 소개된 :
댓글 입력 방식이었습니다).#
그리고 타이핑 시간이 짧기 때문에 사람들이 :
선호하는 것일 수도 있습니다 true
.
POSIX 셸의 또 다른 차이점에 유의하세요( 의 경우 bash
POSIX 모드에서만). 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 으로 설정됩니다 .var
value
:
true
$ var=1; var=2 : ; echo "$var" 2 $ var=1; var=2 true; echo "$var" 1
또한 || true
일련의 쉘에서 작동할 수 있지만 취소할 수는 없습니다.rc
csh
|| :
set -e
csh
|| :
와 같지 않음을 :
의미합니다.또는 :
달리 실행(즉, 이전 파이프라인이 실패한 경우)
set -e
false
0이 아닌(실패) 종료 상태 set -e
(옵션이라고도 함 )로 인해 쉘이 errexit
종료되도록 합니다. 0이 아닌 종료 상태를 반환하는 명령이 다음과 같이 사용되는 false
경우set -e
상황그림:
if false; then ...
while false; do ...
false && : ...
false || : ...
false && :
취소만 가능합니다 set -e
. 취소 하고 종료 상태를 다음으로 설정하는 false || :
효과 따라서 더 관용적으로 말하면 명령의 실패한 종료 코드를 무시하려고 합니다. 대부분의 사람들은 이것이 더 명확하다고 생각합니다 (의도를 더 명확하게 전달).set -e
0
|| true
답변2
이러한 응답의 대부분은 해결에 실패합니다 :
.
첫째, 이 논의는 쉘이 아닌 어떤 것과도 관련이 없습니다.본 쉘( sh
) 파생상품. 즉, 모든 Bourne 파생 쉘은 true
및 :
를 동일한 것으로 취급합니다. 프로그래머는 항상 내장되어 있기 때문에 :
대신 사용하도록 권장되었지만 과거에는 어떤 경우에는 항상 내장되지 않았습니다 .true
:
true
:
두 가지 용도가 있습니다. 와 동의어는 아니지만 #
다른 기능을 가지고 있습니다. 에서 스크립트를 디버깅할 때 set -x
사용된 줄은 #
파서에 의해 제거되고 완전히 무시되는 반면, 사용된 줄은 :
구문 분석되고 평가됩니다. 이는 -x
라인 아래에 표시되고 평가된 값을 표시하므로 디버깅에 매우 유용합니다 . 이는 모드에서만 나타나는 print
명령문을 코드에 넣는 것과 같습니다 -x
. 다음 값 :
은 실제 코드이므로 부작용이 프로그램에 영향을 줄 수 있으므로 주의하시기 바랍니다 .
답변3
일반적으로 bash에서는 콜론 :
과 true
동일합니다.
|| :가 더 관용적이라고 생각되나요?
나는 이것이 기반이라고 생각한다.문맥.
return value
a 또는 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