bash (oder was auch immer Sie als Shell verwenden) liest zuerst alle Eingaben und beginnt, Sonderzeichen wie ?
und zu interpretieren *
. *
wird auf alle Übereinstimmungen in der CWD erweitert, was bedeutet, dass der Stern durch die Übereinstimmungen ersetzt wird.
In den meisten Fällen ist dies ein wenig nach vorne gerichtet, kann jedoch gelegentlich zu einigen verwirrenden Fällen führen.
Folgendes berücksichtigen. Ein Verzeichnis hat diesen Inhalt:
- Test (reguläre Datei)
- test1 (verzeichnis)
- test2 (verzeichnis)
- test3 (verzeichnis)
Wenn Sie dann mv *
etwas tippen, passiert ein scheinbar seltsames Ereignis: Ist test3
dort, aber der Rest ist weg. Obwohl es zunächst seltsam ist, macht es Sinn, wenn Sie erst einmal verstanden haben, worauf sich bash tatsächlich bezieht mv
. Aufgrund des Sterns interpretiert bash das mv *
als mv test test1 test2 test3
, und wenn mv diese Liste erhält, wird davon ausgegangen, dass das letzte Argument das Ziel ist, in das alle Dateien verschoben worden wären.
Für die Befehle, die Sie aufgelistet haben:
echo *
kann als armes mans funktionierenls
. Die Shell wird das Sternchen auf das erweitern, was sich in diesem Verzeichnis befindet, und wie ich sicher weiß, dass Sie es bereits wissen,echo
wird es buchstäblich alles widerhallen, was als Bash an ihn übergeben wird.cp temp temp*
verhält sich etwas wie dermv
Befehl, den ich oben beschrieben habe, es sei denn, es gibt nur ein Verzeichnis mit dem Namen temp. In diesem Fall sind Quell- und Zielname identisch, dh es wird nichts ausgeführt.