wofür wird der bash-Befehl `command` verwendet und was ist er, wenn er in einem Shell-Skript erscheint?

222
Tiina

Als ich ein Shell-Skript schrieb, weiß ich zufällig, dass commandes ein zurückhaltendes Wort ist. Dann fiel mir auf, dass command auch ein Bash-Befehl ist.

  • command lsgibt das gleiche Ergebnis wie ls.
  • command ls | grep xxx gibt das gleiche Ergebnis wie ohne.

Dann frage ich mich, wofür es verwendet wird, wenn es ein Bash-Befehl ist. Und wofür wird es verwendet, wenn es sich in einem Shell-Skript befindet. Vielen Dank!

1

1 Antwort auf die Frage

2
Kamil Maciorowski

command fooführt den fooBefehl auch dann aus, wenn eine fooShell-Funktion definiert ist. Dieses Verhalten ist für POSIX erforderlich .

Damit können Sie den fooBefehl innerhalb der fooFunktion aufrufen . Ohne command foodie Funktion würde sich (beim Aufruf) selbst aufrufen und eine Zirkelreferenz erstellen.

Manchmal können Sie die fooausführbare Datei mit ihrem vollständigen Pfad aufrufen, um die Suche nach der Shell-Funktion zu unterdrücken (umständlich und nicht portabel, immer noch eine Art Problemumgehung), aber in manchen Fällen ist dies nicht möglich. In dieser Antwort von mir (nahe dem Ende) werde ich neu definiert cdund command cdist ein Muss, denn selbst wenn es eine cdausführbare Datei gibt, deren vollständigen Pfad ich verwenden könnte, würde das Verzeichnis nicht geändert. Die Verwendung commandist der richtige Weg, um damit umzugehen.

Auch note command foowird keinen fooAlias auslösen (falls vorhanden). Sie haben lsals Beispiel verwendet. Mindestens einige gemeinsame alias Linux - Distributionen lsauf ls --color=autoder Standardeinstellung. In diesem Fall lsund command lskann unterschiedliche Ergebnisse (dh farbig oder nicht) ergeben. Bei der POSIX-Definition (oder einer anderen Definition von) commandmüssen keine Aliasnamen erwähnt werden, da Aliasnamen (sofern vorhanden) bar foonicht ausgelöst werden foo(mit wenigen Ausnahmen bar, die jedoch commandkeine sind).

Ob Sie command fooin einer interaktiven Shell-Sitzung oder in einem Shell-Skript verwenden, kann foofür das commandeingebaute Programm von Bedeutung sein, nicht jedoch für das eingebaute.