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>:.txt
und zu strace bash -c true 2>true.txt
unterscheiden, 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 true
sind nicht sehr nützlich, und sie geben dasselbe in bash
und zurück dash
. Gibt es überhaupt einen praktischen Unterschied zwischen ihnen, außer dass :
drei Bytes gespart werden und Skripte weniger lesbar sind?
Antworten:
Es gibt keinen wirklichen Unterschied im Verhalten. Beide Befehle tun nichts und beenden sich mit einem erfolgreichen Status.
:
betont, nichts zu tun;true
unterstreicht den erfolgreichen Status.strace true
funktioniert, weiltrue
es 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 BashDie 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 ineval.c
, aber ich konnte kein sichtbar anderes Verhalten erzeugen als das Wortspecial
in der Ausgabe vontype :
.quelle
/bin/true
oder/bin/false
. Auch der:
Befehl wird manchmal für die Argument Verarbeitung Nebenwirkungen verwendet:: ${num_times:=10}
.:
war ursprünglich ein Bezeichnungsindikator , der sich in einem Vorfahren der Bourne-Shell befandgoto
. Anscheinend:
wurde es als Kommentarindikator missbraucht und blieb stecken.:
als Beschriftungsindikator für goto wurde in Microsofts Pseudo-Unix-Befehlszeilenklon beibehaltencommand.com
und bleibt in seinem Nachfolgercmd.exe
, ebenso wie die Praxis des Missbrauchs::
für einen Zeilenkommentar.Sie sind in Bash identisch. Schau mal
builtins/colon.def
im Bash-4.2 Quellcode.In Ihrem Befehl führen
strace true
Sie tatsächlich die Binärdatei/bin/true
anstelle der in Bash integrierten True aus.quelle