Quelle est la difference entre: et true?

15

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>:.txtet 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 truene sont pas très utiles, et ils retournent la même chose dans bashet dash. Y a-t-il une différence pratique entre eux, sauf qu'ils :économisent trois octets et rendent les scripts moins lisibles?

l0b0
la source

Réponses:

27

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; truesouligne le statut réussi.

strace truefonctionne car trueest à 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, essayez

type -a :
type -a true

Les 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 dans eval.c, mais je n'ai pas pu produire de comportement visiblement différent autre que le mot specialdans la sortie de type :.

Keith Thompson
la source
8
De plus, les premières versions d'UNIX n'avaient pas /bin/trueou /bin/false. Aussi la :commande est parfois utilisé pour les effets secondaires de traitement des arguments: : ${num_times:=10}.
Arcege
5
:était à l' origine un indicateur d'étiquette , de retour dans un ancêtre de la coquille Bourne qui avait goto. Apparemment, a :été abusé comme indicateur de commentaire et coincé.
Gilles 'SO- arrête d'être méchant'
1
Le comportement d' :un indicateur d'étiquette pour goto a été conservé dans le clone de ligne de commande pseudo-Unix de Microsoft command.com, et reste dans son successeur cmd.exe, tout comme la pratique d'abuser ::pour un commentaire de ligne.
Sorpigal
8

Ils sont identiques dans Bash. Regardez builtins/colon.defdans le code source de Bash-4.2.

Dans votre commande, strace truevous exécutez réellement le binaire /bin/trueau lieu du bash intégré true.

Jodie C
la source