Was ist die Funktion des Sterns als eigenständiger Befehl in Unix?

21

Ich habe im Terminal von Red Hat Linux herumgespielt und als ich das Sternchen ( *) gefolgt von der Rückgabe eingegeben habe , hat es eines der Programme in meinem Verzeichnis ausgeführt. Warum?

Ich gehe davon aus, dass Unix es als Platzhalter behandelt und das erste alphabetische Programm ausgeführt hat. Da der Platzhalter-Operator alle möglichen Dateien darstellt my_program.exeund one_of_my_programs.programausgeführt werden kann, indem einfach der Name der Datei eingegeben wird. Da ein Programm zuerst alphabetisch ist, führt Unix es aus. Ist das ein richtiges Urteil?

user6086585
quelle
Ich denke, nicht alle Shells sortieren die Erweiterung *alphabetisch, aber Bash ist eine, die dies tut.
Aschepler
1
@taschepler: Alle POSIX-konformen Shells müssen; siehe pubs.opengroup.org/onlinepubs/9699919799/utilities/… Abs. 3.
dave_thompson_085

Antworten:

20

Ihre Interpretation ist richtig. Der Rest der Dateien wird als Parameterliste angezeigt.

Beachten Sie, dass dies nur möglich ist, wenn für das Programm das ausführbare Bit gesetzt ist und sich das aktuelle Verzeichnis in der PATHListe befindet.

Ein paar Hinweise, die zum Verständnis beitragen können:

  • Wenn Sie eingeben, ./*ist der PATHEintrag keine Voraussetzung.
  • Wenn Sie . *oder . ./*eingeben und die erste übereinstimmende Datei ein Skript ist, muss sie weder ausführbar sein noch muss sich das aktuelle Verzeichnis in befinden PATH(gilt möglicherweise nicht für andere Shells als bash).
AFH
quelle
10
"es wird dies nur tun ..." - Es kann interessanter sein. Wenn eine Shell-Funktion, eine eingebaute oder eine ausführbare Datei PATHmit demselben Namen wie die erste Datei vorhanden ist, wird dieser andere Befehl ausgeführt. mkdir foo; cd foo; touch rm xyz; ls; *; ls.
Kamil Maciorowski
@KamilMaciorowski - Fair point: meine Aussage "es wird das nur machen ..." spezifizierte notwendige Bedingungen, aber nicht ausreichende . Der Befehl verhält sich auch anders, wenn *es sich um einen Alias ​​handelt.
AFH
1
Fazit: Mach das nicht! Beachten Sie, dass diese Reihenfolge vom Gebietsschema abhängt, auch wenn Sie der Meinung sind, dass Sie sich auf die alphabetische Reihenfolge der Glob-Erweiterung verlassen können.
Aaron
zusätzlich zu . *oder . ./*kann man bash *(oder jede andere Schale).
Olivier Dulac
11

Dies deutet darauf hin, dass dies .Teil Ihrer PATHVariablen ist. Das ist aus Sicherheitsgründen eine wirklich schlechte Idee (natürlich musste Windows einen nicht änderbaren Standardwert festlegen).

Dieser "Vorschlag" ist jedoch nur in geringem Maße gültig: Wenn Sie eine Datei mit dem Namen rmin Ihrem aktuellen Verzeichnis haben, *wird die Standardausführung in Ordnung sein rm :

/tmp$ mkdir ohno
/tmp$ cd ohno
/tmp/ohno$ 
/tmp/ohno$ ls
/tmp/ohno$ touch rm what
/tmp/ohno$ ls
rm  what
/tmp/ohno$ *
/tmp/ohno$ ls
rm
/tmp/ohno$ 

Wie Sie sehen, war es nicht rm das aktuelle Verzeichnis (eine leere und nicht ausführbare Datei) ausgeführt, sondern die Standardeinstellung des Systems /bin/rm.

Überprüfen Sie immer Ihre Befehle, wenn Platzhalter beteiligt sind. Hier ist eine der furchterregendsten Botschaften, die es je zu lesen gab:

rm: cannot remove '.o': No such file or directory

Dies ist das Ergebnis eines Anrufs

rm * .o

, mehr oder weniger die schlechteste Platzierung eines falschen Raums, die man sich vorstellen kann.


quelle
1
Es tut nicht weh, eine Funktion zu erstellen, rm()die entweder -idie Parameter ergänzt oder die Parameter überprüft und nach Bestätigung fragt, ob mehr als eine bestimmte Anzahl vorhanden ist.
AFH
3
+1 für "Hier ist eine der furchterregendsten Nachrichten, die es je zu lesen gab".
Mehrdad
+1 für "Das ist aus Sicherheitsgründen eine wirklich schlechte Idee (natürlich musste Windows einen nicht änderbaren Standardwert festlegen)."
Duncan X Simpson
FTFY: mv /tmp/ohno /tmp/ohnoes( google.fr/search?q=ohnoes&source=lnms&tbm=isch )
Olivier Dulac
Es gibt einen guten Grund, warum Windows es zu einem nicht änderbaren Standard gemacht hat. Es muss eine Kette von Abwärtskompatibilitäten von den Tagen vor der Implementierung von DOS-Verzeichnissen aufrechterhalten. Denken Sie daran, dass damals niemand, der einen PC benutzte, eine Festplatte hatte und die Disketten so klein waren, dass Verzeichnisse anfangs nicht für notwendig gehalten wurden.
Muzer