: 와 true 의 차이점은 무엇인가요?

: 와 true 의 차이점은 무엇인가요?

안에 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)                           = ?

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바이트를 절약하고 스크립트를 읽기 어렵게 만드는 점을 제외하면 둘 사이에 실질적인 차이점이 있습니까 ?

답변1

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

strace truetrue은 쉘 내장 기능과 외부 명령( /bin/true) 이기 때문에 작동합니다 . :쉘이 내장되어 있을 뿐입니다(아무것도 없습니다 /bin/:. 있을 수도 있고 아마도 매우 오래된 Unix 시스템에 있었을 것입니다). Bash에서 시도해보십시오

type -a :
type -a true

둘 다 존재하는 이유는 역사적입니다. 내 기억이 맞다면 일부 초기 쉘에는 주석 구문이 없었기 때문에 :대신 do-nothing 명령이 사용되었습니다.

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

답변2

Bash에서는 동일합니다. builtins/colon.defBash-4.2 소스 코드를 살펴보세요 .

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

답변3

명령 간의 차이점은 정의에 따르면 :다음과 같습니다.특수 내장반면 유틸리티 true일반 내장POSIX 호환 쉘의 유틸리티입니다.

POSIX 사양에 따르면,특수 내장다음과 같은 방식으로 약간 다르게 취급됩니다.

특수 내장 유틸리티 호출 이전의 변수 할당은 내장 유틸리티가 완료된 후에도 계속 유효합니다. 이는 일반 내장 유틸리티나 기타 유틸리티의 경우에는 해당되지 않습니다.

이는 POSIX 호환 셸에서 다음과 같이 설명할 수 있습니다.

$ VAR=FOO
$ VAR=BAR :
$ echo "$VAR"
BAR
$ VAR=FOO
$ VAR=BAR true
$ echo "$VAR"
FOO

차이점의 또 다른 측면은 다음과 같습니다.

특수 내장 유틸리티의 오류로 인해 해당 유틸리티를 실행하는 쉘이 중단될 수 있지만 일반 내장 유틸리티의 오류로 인해 해당 유틸리티를 실행하는 쉘이 중단되지는 않습니다.

실제 코드 예시:

$ ( : > ""; echo "You won't see this!" )
sh: 1: cannot create : Directory nonexistent
$  echo "Exit code: $?"
Exit code: 2
$ ( true > ""; echo "Hello!" )
sh: 1: cannot create : Directory nonexistent
Hello!
$ echo "Exit code: $?"
Exit code: 0

관련 정보