Was ist der Unterschied zwischen: und wahr?

15

In bash:

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

Sieht so aus, als wären sie gleich, aber sie geben nicht die gleiche Systemspur:

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

Ich habe versucht, strace bash -c : 2>:.txtund zu strace bash -c true 2>true.txtunterscheiden, konnte aber keine Unterschiede zwischen ihnen feststellen, mit Ausnahme der Speicherorte.

In dash:

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

OK, also sind sie nicht gleich. help :und help truesind nicht sehr nützlich, und sie geben dasselbe in bashund zurück dash. Gibt es überhaupt einen praktischen Unterschied zwischen ihnen, außer dass :drei Bytes gespart werden und Skripte weniger lesbar sind?

l0b0
quelle

Antworten:

27

Es gibt keinen wirklichen Unterschied im Verhalten. Beide Befehle tun nichts und beenden sich mit einem erfolgreichen Status. :betont, nichts zu tun; trueunterstreicht den erfolgreichen Status.

strace truefunktioniert, weil truees sich sowohl um eine eingebaute Shell als auch um einen externen Befehl handelt ( /bin/true); :ist nur eine eingebaute Shell (es gibt keine /bin/:- obwohl es sein könnte und wahrscheinlich auf sehr alten Unix-Systemen war). Versuchen Sie es in der Bash

type -a :
type -a true

Die Gründe, aus denen beide existieren, sind historisch. Wenn ich mich recht erinnere, hatten einige sehr frühe Shells keine Kommentarsyntax, weshalb :stattdessen der Befehl do-nothing verwendet wurde.

Es gibt einige interne Unterschiede in dash. Ein Blick in den Quellcode, der unter git: //git.kernel.org/pub/scm/utils/dash/dash.git verfügbar ist, zeigt einige unterschiedliche Codepfade in eval.c, aber ich konnte kein sichtbar anderes Verhalten erzeugen als das Wort specialin der Ausgabe von type :.

Keith Thompson
quelle
8
Darüber hinaus hatten frühe Versionen von UNIX nicht /bin/trueoder /bin/false. Auch der :Befehl wird manchmal für die Argument Verarbeitung Nebenwirkungen verwendet: : ${num_times:=10}.
Arcege
5
:war ursprünglich ein Bezeichnungsindikator , der sich in einem Vorfahren der Bourne-Shell befand goto. Anscheinend :wurde es als Kommentarindikator missbraucht und blieb stecken.
Gilles 'SO - hör auf böse zu sein'
1
Das Verhalten :als Beschriftungsindikator für goto wurde in Microsofts Pseudo-Unix-Befehlszeilenklon beibehalten command.comund bleibt in seinem Nachfolger cmd.exe, ebenso wie die Praxis des Missbrauchs ::für einen Zeilenkommentar.
Sorpigal
8

Sie sind in Bash identisch. Schau mal builtins/colon.defim Bash-4.2 Quellcode.

In Ihrem Befehl führen strace trueSie tatsächlich die Binärdatei /bin/trueanstelle der in Bash integrierten True aus.

Jodie C
quelle