Qual é a diferença entre: e true?

13

Em bash :

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

Parece que são iguais, mas não fornecem o mesmo rastreamento de sistema:

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

Eu tentei diferenciar strace bash -c : 2>:.txt e strace bash -c true 2>true.txt , mas não consegui encontrar nenhuma diferença entre eles, exceto os locais da 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 iguais. help : e help true não são muito úteis e retornam o mesmo em bash e dash . Existe alguma diferença prática entre eles, exceto que : salva três bytes e torna os scripts menos legíveis?

    
por l0b0 21.03.2012 / 18:00

2 respostas

24

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

strace true funciona porque true é um shell interno 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 ambos existem são históricas. Se bem me lembro, alguns shells muito antigos não tinham uma sintaxe de comentário, então o comando do-nothing : foi usado no lugar.

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 em eval.c , mas eu não consegui produzir nenhum visivelmente comportamento diferente da palavra special na saída de type : .

    
por 21.03.2012 / 18:39
6

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

Em seu comando strace true , você está realmente executando o binário /bin/true em vez do true incorporado do bash.

    
por 21.03.2012 / 19:00

Tags