:와 true의 차이점은 무엇입니까?


15

에서 bash:

$ type :
: is a shell builtin
$ type true
true is a shell builtin

그들은 같은 것처럼 보이지만 동일한 시스템 추적을 제공하지 않습니다.

$ strace :
strace: :: command not found
$ strace true
execve("/bin/true", ["true"], [/* 82 vars */]) = 0
[snip]
exit_group(0)                           = ?

나는 diffing의 시도 strace bash -c : 2>:.txt하고 strace bash -c true 2>true.txt있지만, 메모리 위치를 제외하고 그들 사이의 차이를 찾을 수 없습니다.

에서 dash:

$ type :
: is a special shell builtin
$ type true
true is a shell builtin

좋아요, 그래서 그들은 같지 않습니다. help :그리고 help true매우 유용하지, 그들은 동일한을 반환 bash하고 dash. :3 바이트 를 절약 하고 스크립트를 읽기 어렵게 만드는 것을 제외하고는 그들 사이에 실질적인 차이가 있습니까?


답변:


27

행동에는 실질적인 차이가 없습니다. 두 명령 모두 아무것도하지 않고 성공적인 상태로 종료됩니다. :아무것도하지 않는 것을 강조한다. true성공적인 지위를 강조합니다.

strace truetrue쉘 내장 및 외부 명령 ( /bin/true) 이기 때문에 작동합니다 . :쉘만 내장되어 있습니다 ( /bin/:아직 없을 수도 있습니다. 아마도 오래된 유닉스 시스템에 있었을 수도 있습니다). bash에서 시도하십시오

type -a :
type -a true

둘 다 존재하는 이유는 역사적입니다. 올바르게 기억한다면 초기 쉘에는 주석 구문이 없으므로 do-nothing :명령이 대신 사용되었습니다.

내부에 약간의 차이가 dash있습니다. git : //git.kernel.org/pub/scm/utils/dash/dash.git에서 소스를 살펴보면에 다른 코드 경로가 표시 eval.c되지만 다른 눈에 띄게 다른 동작을 만들 수는 없었습니다. special의 출력 에서 단어보다 type :.


8
또한, UNIX의 초기 버전은하지 않았다 /bin/true/bin/false. 또한이 :명령은 때때로 인수 처리 부작용에 사용됩니다 : ${num_times:=10}.
Arcege

5
:원래는 Bourne 쉘의 조상으로 돌아간 레이블 표시기 였습니다 goto. 분명히 :주석 표시 자로 남용되어 붙어 있습니다.
Gilles 'SO- 악마 중지

1
:goto에 대한 레이블 표시기 의 동작은 Microsoft 의사 유닉스 명령 행 복제에서 command.com유지되었으며 , 행 주석에 대한 cmd.exe악용 사례와 마찬가지로 후속 작업에 그대로 남아 있습니다 ::.
Sorpigal 2016 년

8

Bash에서도 동일합니다. 봐 builtins/colon.def배쉬-4.2 소스 코드입니다.

명령 strace true에서 실제로 /bin/truebash 내장 true 대신 바이너리 를 실행하고 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.