Dans bash
:
$ type :
: is a shell builtin
$ type true
true is a shell builtin
On dirait qu'ils sont identiques, mais ils ne donnent pas la même trace système:
$ strace :
strace: :: command not found
$ strace true
execve("/bin/true", ["true"], [/* 82 vars */]) = 0
[snip]
exit_group(0) = ?
J'ai essayé de faire la différence strace bash -c : 2>:.txt
et strace bash -c true 2>true.txt
, mais je n'ai trouvé aucune différence entre eux, sauf pour les emplacements de mémoire.
Dans dash
:
$ type :
: is a special shell builtin
$ type true
true is a shell builtin
OK, donc ce n'est pas pareil. help :
et help true
ne sont pas très utiles, et ils retournent la même chose dans bash
et dash
. Y a-t-il une différence pratique entre eux, sauf qu'ils :
économisent trois octets et rendent les scripts moins lisibles?
Réponses:
Il n'y a pas de réelle différence de comportement. Les deux commandes ne font rien et quittent avec un état réussi.
:
insiste sur le fait de ne rien faire;true
souligne le statut réussi.strace true
fonctionne cartrue
est à la fois un shell intégré et une commande externe (/bin/true
);:
n'est qu'un shell intégré (il n'y en a pas/bin/:
- bien qu'il puisse y en avoir, et c'était probablement sur de très vieux systèmes Unix). En bash, essayezLes raisons pour lesquelles les deux existent sont historiques. Si je me souviens bien, certains shells très anciens n'avaient pas de syntaxe de commentaire, donc la
:
commande do-nothing a été utilisée à la place.Il y a une différence interne
dash
. En parcourant la source, disponible sur git: //git.kernel.org/pub/scm/utils/dash/dash.git, montre quelques chemins de code différents danseval.c
, mais je n'ai pas pu produire de comportement visiblement différent autre que le motspecial
dans la sortie detype :
.la source
/bin/true
ou/bin/false
. Aussi la:
commande est parfois utilisé pour les effets secondaires de traitement des arguments:: ${num_times:=10}
.:
était à l' origine un indicateur d'étiquette , de retour dans un ancêtre de la coquille Bourne qui avaitgoto
. Apparemment, a:
été abusé comme indicateur de commentaire et coincé.:
un indicateur d'étiquette pour goto a été conservé dans le clone de ligne de commande pseudo-Unix de Microsoftcommand.com
, et reste dans son successeurcmd.exe
, tout comme la pratique d'abuser::
pour un commentaire de ligne.Ils sont identiques dans Bash. Regardez
builtins/colon.def
dans le code source de Bash-4.2.Dans votre commande,
strace true
vous exécutez réellement le binaire/bin/true
au lieu du bash intégré true.la source