[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 쉘은 없었 true
와 false
같은 내장 명령. true
대신 :
에 및 false
에 비슷한 별칭이 지정되었습니다 let 0
.
:
true
고대 Bourne에서 파생 된 포탄에 대한 이식성 보다 약간 낫습니다 . 간단한 예로, !
파이프 라인 연산자 나 ||
목록 연산자 를 사용하지 않는 것이 좋습니다 (일부 Bourne 쉘의 경우와 동일). 종료 상태를 기반으로 분기의 유일한 수단으로 명령문 의 else
절을 남깁니다 if
.
if command; then :; else ...; fi
이후 if
비어 요구 then
절을하고 의견이 비어로 계산하지 않는, :
무 조작의 역할을한다.
요즘 (즉, 현대적인 맥락에서) 일반적으로 :
또는을 사용할 수 있습니다 true
. 둘 다 POSIX에 의해 지정되며 일부는 true
읽기가 쉽습니다. 그러나 거기에 한 가지 흥미로운 차이점은 :
소위 POSIX의입니다 내장 된 특수는 반면, true
A는 내장 된 일반 .
-
쉘에 특수 내장 기능이 내장되어 있어야합니다. 일반 내장 기능은 “일반적으로”내장되어 있지만 엄격하게 보장되지는 않습니다. 일반적으로 대부분의 시스템의 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
인쇄물을 출력 할 때 전자 메일 제목을 더 잘 보이게한다는 것 입니다.