
Beachten Sie diese shell
Befehle
$ls
my_app newlist note
Und
$echo *
my_app newlist note
Und
$printf *
my_app
Der erste Befehl ls
listet Informationen zu den Dateien auf (standardmäßig das aktuelle Verzeichnis). Der zweite Befehl echo
ist ein Befehl, der die Zeichenfolgen ausgibt, die ihm als Argumente übergeben werden. Wenn ich jedoch tippe, echo *
wird dasselbe ausgegeben wie ls
.
Und printf *
gibt mir nur den ersten Dateinamen als Ausgabe
Warum wird das so echo
interpretiert ? Und warum , was noch seltsamer ist: mit der Ausgabe nur des ersten?*
printf
Antwort1
Warum echo
interpretiert das *
das gleiche wiels
Die Antwort ist einfach. Das ist es nicht. echo
tut genau das, was Sie sagen: Es iteriert durch seine Argumente und gibt sie mit einem Leerzeichen dazwischen aus.
Warum also beobachten wir ein Verhalten wie ls
?
*
Dies liegt daran, dass die Shell die durch eine Parameterliste ersetzt, die auf alle Dateien passt (die nicht mit einem beginnen .
(es sei denn, dotglob ist aktiviert)). Dann echo
macht sie einfach ihre Arbeit. Diese Glob-Ersetzung erfolgt füralleBefehle, da dies von der Shell und nicht vom Befehl ausgeführt wird.
Und was ist mit printf
?
printf
ist die Druckformatierung. Das erste Argument ist das Format. Wenn Sie dies tun printf "%s " *
, ist es wie echo
.
Wenn die erste Datei ist hello%sworld
, erhalten Sie:hellofile2world hellofile3world
Mehr erfahren
Versuchen Sie dies. Dadurch erfahren Sie, was passiert. (Ich schlage nicht vor, dass Sie diesen Code für etwas Reales verwenden. Verwenden Sie ihn nur zum Lernen.)
Versuchen Sie es cat /proc/self/cmdline * | less
– Es wird beim Start angezeigt, wie die Befehlszeile aussieht (nachdem die Shell ihren Teil getan hat).
Antwort2
nur weil es keine Eingabe zum Anzeigen hat, sondern eine Liste von * (allen) Dateien als Parameter zum Anzeigen als Zeichenfolge
so einfach ist das
während * Parameter ist, gibt es den "*"-Inhalt wieder, also die Liste der Dateien