: 와 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

둘 다 존재하는 이유는 역사적입니다. 내 기억이 맞다면 일부 초기 쉘에는 주석 구문이 없었기 때문에 :아무것도 하지 않는 명령이 사용되었습니다.

내부적으로 약간의 차이가 있습니다 dash. 소스 코드(git://git.kernel.org/pub/scm/utils/dash/dash.git에서 사용 가능)를 보면 몇 가지 다른 코드 경로가 표시되지만 텍스트 eval.c와 크게 다른 동작을 생성할 수는 없습니다. special출력 type :.

답변2

Bash에서는 동일합니다. builtins/colon.defBash-4.2 소스 코드를 확인하세요 .

귀하의 명령에서는 bash 내장 true가 아닌 strace true실제로 바이너리를 실행하고 있습니다 ./bin/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

관련 정보