Qual é a diferença entre: e true?

15

Em bash:

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

Parece que eles são iguais, mas não dão o mesmo rastreio do sistema:

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

Tentei diferenciar strace bash -c : 2>:.txte strace bash -c true 2>true.txt, mas não consegui encontrar nenhuma diferença entre eles, exceto os locais de memória.

Em dash:

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

OK, então eles não são os mesmos. help :e help truenão são muito úteis, e retornam o mesmo em bashe dash. Existe alguma diferença prática entre eles, exceto que :economiza três bytes e torna os scripts menos legíveis?

l0b0
fonte

Respostas:

27

Não há diferença real no comportamento. Ambos os comandos não fazem nada e saem com um status bem-sucedido. :enfatiza não fazer nada; trueenfatiza o status de sucesso.

strace truefunciona porque trueé um shell embutido e um comando externo ( /bin/true); :é apenas um shell embutido (não há /bin/:- embora possa haver, e provavelmente estava em sistemas Unix muito antigos). No bash, tente

type -a :
type -a true

As razões pelas quais ambas existem são históricas. Se bem me lembro, alguns shells muito antigos não tinham uma sintaxe de comentário; portanto, o :comando do-nothing foi usado.

Existe alguma diferença interna em dash. Olhando através da fonte, disponível em git: //git.kernel.org/pub/scm/utils/dash/dash.git, mostra alguns caminhos de código diferentes eval.c, mas não consegui produzir nenhum comportamento visivelmente diferente do que a palavra specialna saída de type :.

Keith Thompson
fonte
8
Além disso, as versões anteriores do UNIX não tinham /bin/trueou /bin/false. Além disso, o :comando é por vezes utilizado para os efeitos colaterais processamento argumento: : ${num_times:=10}.
Arcege 21/03/12
5
:era originalmente um indicador de etiqueta , de volta a um ancestral da concha Bourne que possuía goto. Aparentemente, :foi abusado como um indicador de comentário e preso.
Gilles 'SO- stop be evil'
1
O comportamento de :como um indicador de rótulo para goto foi preservado no clone da linha de comando pseudo-Unix da Microsoft command.come permanece em seu sucessor cmd.exe, assim como a prática de abusar ::de um comentário de linha.
22812 Sorpigal
8

Eles são idênticos no Bash. Veja builtins/colon.defo código-fonte do Bash-4.2.

No seu comando, strace truevocê está realmente executando o binário em /bin/truevez do bash true incorporado.

Jodie C
fonte