[bash] : (콜론) GNU Bash 내장의 목적은 무엇입니까?

주석 리더에 지나지 않지만 실제로 내장 된 쉘인 명령의 목적은 무엇입니까?

호출 당 약 40 % 정도 주석을 스크립트에 삽입하는 것보다 속도가 느립니다. 주석의 크기에 따라 크게 달라질 수 있습니다. 내가 볼 수있는 유일한 이유는 다음과 같습니다.

# poor man's delay function
for ((x=0;x<100000;++x)) ; do : ; done

# inserting comments into string of commands
command ; command ; : we need a comment in here for some reason ; command

# an alias for `true' (lazy programming)
while : ; do command ; done

내가 실제로 찾고있는 것은 역사적인 응용 프로그램 일 것입니다.



답변

역사적으로 ,의 Bourne 쉘은 없었 truefalse같은 내장 명령. true대신 :에 및 false에 비슷한 별칭이 지정되었습니다 let 0.

:true고대 Bourne에서 파생 된 포탄에 대한 이식성 보다 약간 낫습니다 . 간단한 예로, !파이프 라인 연산자 나 ||목록 연산자 를 사용하지 않는 것이 좋습니다 (일부 Bourne 쉘의 경우와 동일). 종료 상태를 기반으로 분기의 유일한 수단으로 명령문 의 else절을 남깁니다 if.

if command; then :; else ...; fi

이후 if비어 요구 then절을하고 의견이 비어로 계산하지 않는, :무 조작의 역할을한다.

요즘 (즉, 현대적인 맥락에서) 일반적으로 :또는을 사용할 수 있습니다 true. 둘 다 POSIX에 의해 지정되며 일부는 true읽기가 쉽습니다. 그러나 거기에 한 가지 흥미로운 차이점은 :소위 POSIX의입니다 내장 된 특수는 반면, trueA는 내장 된 일반 .

  • 쉘에 특수 내장 기능이 내장되어 있어야합니다. 일반 내장 기능은 “일반적으로”내장되어 있지만 엄격하게 보장되지는 않습니다. 일반적으로 대부분의 시스템의 PATH :에서 기능 이있는 정규 프로그램이 없어야 true합니다.

  • 아마도 가장 중요한 차이점은 특수 내장 기능을 사용하면 간단한 명령 평가 중 환경에서도 내장 기능에 의해 설정된 모든 변수가 ksh93을 사용하여 명령을 완료 한 후에 명령이 완료된 후에도 지속된다는 것입니다.

    $ unset x; ( x=hi :; echo "$x" )
    hi
    $ ( x=hi true; echo "$x" )
    
    $

    Zsh는 POSIX 호환 모드에서 작동 할 때를 제외하고 GNU Bash와 마찬가지로이 요구 사항을 무시하지만, 모든 주요 “POSIX sh 파생”쉘은 dash, ksh93 및 mksh를 포함하여이를 관찰합니다.

  • 또 다른 차이점은 일반 내장 기능이 호환되어야한다는 것입니다 exec-여기 Bash를 사용하여 설명하십시오.

    $ ( exec : )
    -bash: exec: :: not found
    $ ( exec true )
    $
  • POSIX는 물론 구현 관련 세부 사항이지만 :보다 빠를 수도 있음을 명시 적으로 지적합니다 true.


답변

변수 명령을 쉽게 활성화 / 비활성화하는 데 사용합니다.

#!/bin/bash
if [[ "$VERBOSE" == "" || "$VERBOSE" == "0" ]]; then
    vecho=":"     # no "verbose echo"
else
    vecho=echo    # enable "verbose echo"
fi

$vecho "Verbose echo is ON"

그러므로

$ ./vecho
$ VERBOSE=1 ./vecho
Verbose echo is ON

이것은 깨끗한 스크립트를 만듭니다. ‘#’으로는 수행 할 수 없습니다.

또한,

: >afile

‘afile’이 존재하지만 길이가 0임을 보장하는 가장 간단한 방법 중 하나입니다.


답변

에 대한 유용한 응용 프로그램은 실제로 결과를 명령에 전달하지 않고 부작용에 매개 변수 확장 만 사용하려는 경우입니다. 이 경우 종료 상태 0 또는 1을 원하는지 여부에 따라 PE를 : 또는 false의 인수로 사용합니다 : "${var:=$1}". 예는 다음과 같습니다 . :내장되어 있기 때문에 꽤 빠릅니다.


답변

:블록 주석 일 수도 있습니다 (C 언어의 / * * /와 유사). 예를 들어, 스크립트에서 코드 블록을 건너 뛰려면 다음과 같이하십시오.

: << 'SKIP'

your code block here

SKIP


답변

로그를 지우는 데 유용한 파일을 0 바이트로 자르려면 다음을 시도하십시오.

:> file.log


답변

pass파이썬 과 비슷합니다 .

한 가지 용도는 함수가 작성 될 때까지 함수를 스텁 아웃하는 것입니다.

future_function () { :; }


답변

다른 답변에는 언급되지 않은 두 가지 용도가 더 있습니다.

벌채 반출

이 예제 스크립트를 보자 :

set -x
: Logging message here
example_command

첫 번째 줄인에서는 set -x명령을 실행하기 전에 셸에서 명령을 인쇄합니다. 꽤 유용한 구성입니다. 단점은 echo Log message이제 일반적인 유형의 명령문이 메시지를 두 번 인쇄한다는 것입니다. 콜론 방법은 그것을 극복합니다. 원하는 것처럼 여전히 특수 문자를 이스케이프해야합니다 echo.

크론 직책

나는 cron 작업에서 다음과 같이 사용되는 것을 보았습니다.

45 10 * * * : Backup for database ; /opt/backup.sh

/opt/backup.sh매일 10:45에 스크립트를 실행하는 크론 작업입니다 . 이 기술의 장점은 /opt/backup.sh인쇄물을 출력 할 때 전자 메일 제목을 더 잘 보이게한다는 것 입니다.