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>:.txt
e 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 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 :
economiza três bytes e torna os scripts menos legíveis?
Respostas:
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;true
enfatiza o status de sucesso.strace true
funciona porquetrue
é 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, tenteAs 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 diferenteseval.c
, mas não consegui produzir nenhum comportamento visivelmente diferente do que a palavraspecial
na saída detype :
.fonte
/bin/true
ou/bin/false
. Além disso, o:
comando é por vezes utilizado para os efeitos colaterais processamento argumento:: ${num_times:=10}
.:
era originalmente um indicador de etiqueta , de volta a um ancestral da concha Bourne que possuíagoto
. Aparentemente,:
foi abusado como um indicador de comentário e preso.:
como um indicador de rótulo para goto foi preservado no clone da linha de comando pseudo-Unix da Microsoftcommand.com
e permanece em seu sucessorcmd.exe
, assim como a prática de abusar::
de um comentário de linha.Eles são idênticos no Bash. Veja
builtins/colon.def
o código-fonte do Bash-4.2.No seu comando,
strace true
você está realmente executando o binário em/bin/true
vez do bash true incorporado.fonte