나는 많은 쉘 스크립트를 해독했는데 때로는 가장 간단한 것들이 나를 혼란스럽게 만듭니다. 오늘 나는 :
(콜론) bash 내장 기능을 광범위하게 사용하는 스크립트를 발견했습니다 .
이것문서그것은 간단해 보인다:
: (a colon) : [arguments]
매개변수 확장 및 리디렉션 수행 외에는 아무것도 수행하지 않습니다. 반환 상태는 0입니다.
그러나 나는 이전에 쉘 확장 시연에서 사용된 것을 본 적이 있습니다. 내가 본 스크립트의 사용 사례에서는 이 구조를 광범위하게 사용합니다.
if [ -f ${file} ]; then
grep some_string ${file} >> otherfile || :
grep other_string ${file} >> otherfile || :
fi
문자 그대로 수백 개의 grep이 있지만 그 이상은 동일합니다. 위의 단순한 구조 외에는 입출력 방향 재지정이 없습니다. 반환 값은 나중에 스크립트에서 확인되지 않습니다.
나는 그것을 쓸모없는 구조, 즉 "아무것도 하지 않는 것"으로 봅니다. "또는 아무것도 하지 않음"으로 이러한 grep을 끝내면 무엇을 얻을 수 있습니까? 어떤 상황에서 이 구성이 || :
단순히 모든 인스턴스에서 제거하는 것과 다른 결과를 가져오게 됩니까 ?
답변1
내장 명령은 :
Bash "기본값 할당" 셸 확장에도 유용합니다. 여기서 확장은 일반적으로 부작용으로만 사용되고 확장된 값은 삭제됩니다.
# assign FOO=bar iff FOO is unset or empty
: "${FOO:=bar}"
답변2
:
스크립트의 s가 대신 사용되는 것 같습니다 true
. grep
파일에 일치하는 항목이 없으면 주석에 언급된 jw013과 같이 0이 아닌 종료 코드가 반환됩니다 errexit
(아마도 shebang 줄에 있음). , s 중 어느 것과도 일치하는 항목이 없으면 -e
스크립트가 종료됩니다. grep
분명히 이것은 저자가 원한 것이 아니기 때문에 그는 || :
이 특정 복합 명령의 종료 상태를 항상 0으로 만드는 것을 추가했습니다. 예를 들어 더 일반적인 것입니다(내 경험상) || true
/ || /bin/true
.
답변3
답변4
나는 Kernighan과 Pike가 쓴 "The UNIX 프로그래밍 환경"(c) 1984라는 오래된 참고 자료를 찾아냈습니다.
147페이지(쉘 프로그래밍)에서는 다음과 같이 말합니다.
":"는 인수를 평가하고 "true"를 반환하는 것 외에는 아무 작업도 수행하지 않는 셸 내장 명령입니다. 대신 [스크립트 예제 참조]를 사용할 수 있습니다.진짜, 이는 실제 종료 상태만 반환합니다. (아직 하나 남았는데잘못된주문하다. ) 그러나 ':'이 true보다 더 효과적입니다.파일 시스템에서 명령을 실행하지 않기 때문에. [이탤릭체/강조는 내 것입니다. ]