Wenn ich den test
Befehl in bash ausführe, wird das test
integrierte Dienstprogramm gestartet (wertet den bedingten Ausdruck aus):
$ type test
test is a shell builtin
$ type -a test
test is a shell builtin
test is /usr/local/bin/test
test is /usr/bin/test
$
Wie in der type -a test
obigen Ausgabe zu sehen ist , gibt es jedoch ein weiteres test
Verzeichnis im Verzeichnis / usr / local / bin und ein weiteres im Verzeichnis / usr / bin. Wie werden ausführbare Dateien sortiert, dh werden die integrierten Befehle immer bevorzugt, und der Rest der Befehle hängt von der Verzeichnisreihenfolge in der Variablen $ PATH ab? Ist es außerdem möglich, die Reihenfolge der gestarteten ausführbaren Dateien zu ändern, z. B. wenn ich test
tippe, wird / usr / bin / test anstelle von bash-builtin gestartet test
?
bash
shell
command
shell-builtin
Martin
quelle
quelle
/usr/bin/test -f "$file"
...Antworten:
Die höchste Priorität ist der Bash-Alias, dann spezielle integrierte Funktionen (nur im POSIX-Modus), dann Funktionen, dann integrierte Funktionen und dann eine Suche
$PATH
.Verwenden Sie zum Ausführen eines integrierten Geräts
builtin test
.Verwenden Sie zum Ausführen einer externen Anwendung einen expliziten Pfad :
/bin/test
.Verwenden Sie, um Funktionen und Aliase zu ignorieren
command test
.Um nur Alias zu umgehen, verwenden Sie
\test
oder eine andere Art von Erweiterung.Es ist möglich, ein eingebautes System mit zu deaktivieren / aktivieren
enable test
.(Aktualisiert gemäß den Kommentaren unten)
(Fehlerhafte falsche Administrator-Bearbeitung
disable
behoben , die bash eingebaut hat - tatsächlich gibt es nurenable
)quelle
\test
oder'test'
oder zitierentes't'
./
,$
, Graviszeichen und=
und eines der oben aufgeführten Shell-Metazeichen oder Anführungszeichen wird möglicherweise nicht in einem Aliasnamen angezeigt. "Integrierte Befehle werden immer externen Befehlen vorgezogen. Das Grundprinzip ist, dass der eingebaute Befehl schneller ist (und in einigen Fällen, wie z. B.
cd
oder , nur der eingebaute Befehl den gewünschten Effekt haben kann).test -o BASH_OPTION
Manchmal verfügt der externe Befehl über Funktionen, die die integrierte Shell nicht bietet. In diesem Fall können Sie den externen Befehl aufrufen, indem Sie einen expliziten Pfad angeben (dh einen Schrägstrich enthalten) (dies umgeht alle Bedenken hinsichtlich der Reihenfolge in
$PATH
). Wenn Sie den externen Pfad nicht fest codieren möchten, aber die Verwendung des integrierten Pfads verhindern möchten, können Sie"$(type -P test)"
( NotizkapitalP
) in bash,"$(whence -p test)"
in ksh und=test
in zsh verwenden. Eine andere Möglichkeit, die Verwendung eines externen Befehls zu erzwingen, besteht darin, dascommand
eingebaute (command -p test …
) zu verwenden oder dasenv
Dienstprogramm (env test …
) zu durchlaufen .In zsh können Sie ein eingebautes System mit deaktivieren
disable test
. Dies ist permanent (für die aktuelle Shell oder Subshell), bis das eingebaute System wieder aktiviert wirdenable test
. In bash können Sie dasselbe tunenable -n test
, um zu deaktivieren und wiederenable test
zu aktivieren.Sie können einen Alias oder eine Funktion verwenden, um die Ausführung eines anderen Befehls zu erzwingen, z. B.
alias test=/usr/bin/test
odertest () { /usr/bin/test "$@"; }
. Wenn Sie über einen solchen Alias verfügen, können Sie dessen Verwendung verhindern, indem Sie einen Teil davon zitieren, z. B.\test
die normale Funktion / integrierte / externe Suche ausführen. Beachten Sie, dass Aliasdefinitionen in einer Funktion abhängig von der Shell und ihren Einstellungen erweitert werden können, wenn eine Funktion gelesen oder ausgeführt wird. Wenn Sie eine Funktion definiert haben, können Sie damit sowohlcommand test
die Funktionssuche als auch dietest
Aliasuche verhindern (daher wird hier die integrierte Funktion aufgerufen, sofern sie nicht deaktiviert ist).quelle
env
auch hier nicht angebracht?df
einen PATH an der ersten Position voll hinzugefügt , den Alias 'df' entfernt,which df
zeigt / opt / bin / df, aber df läuft / bin / df -> Busyboxwhich df
zeigt Ihnen nicht unbedingt, wasdf
läuft. unix.stackexchange.com/questions/85249/…