내장된 콜론 ":"은 무엇을 합니까?

내장된 콜론 ":"은 무엇을 합니까?

나는 많은 쉘 스크립트를 해독했는데 때로는 가장 간단한 것들이 나를 혼란스럽게 만듭니다. 오늘 나는 :(콜론) 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

:이미 내장되어 있음톰슨 쉘- 그것은녹음된~을 위한유닉스 V61975. Thompson 쉘에는 :레이블이 표시되어 있습니다.goto주문하다. goto로 시작하는 줄을 호출하지 않으면 해당 줄은 실제로 주석입니다.

이것본 쉘Bourne/POSIX 셸로 알려진 것의 조상인 는 내가 아는 한 전혀 없었지만 무작동 명령으로 goto유지되었습니다 (이미:유닉스 V7), 일반적으로 주석에 사용됩니다(실제 주석 구문은 #이후 버전에서만 추가되었습니다).

답변4

나는 Kernighan과 Pike가 쓴 "The UNIX 프로그래밍 환경"(c) 1984라는 오래된 참고 자료를 찾아냈습니다.

147페이지(쉘 프로그래밍)에서는 다음과 같이 말합니다.

":"는 인수를 평가하고 "true"를 반환하는 것 외에는 아무 작업도 수행하지 않는 셸 내장 명령입니다. 대신 [스크립트 예제 참조]를 사용할 수 있습니다.진짜, 이는 실제 종료 상태만 반환합니다. (아직 하나 남았는데잘못된주문하다. ) 그러나 ':'이 true보다 더 효과적입니다.파일 시스템에서 명령을 실행하지 않기 때문에. [이탤릭체/강조는 내 것입니다. ]

관련 정보