Sie können die command
eingebaute Shell verwenden, um den normalen Suchvorgang zu umgehen und den angegebenen Befehl als externen Befehl auszuführen, unabhängig von anderen Möglichkeiten (eingebaute Shell, Aliase usw.). Dies geschieht häufig in Skripten, die systemübergreifend portierbar sein müssen, obwohl wahrscheinlich häufiger die Kurzform verwendet wird \
(wie in \rm
und nicht command rm
oder rm
, da insbesondere letztere auf etwas ausgerichtet sein können, das nicht bekannt ist wie rm -i
).
$ time
real 0m0.000s
user 0m0.000s
sys 0m0.000s
$ command time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
$
Dies kann mit einem Alias wie folgt verwendet werden:
$ alias time='command time'
$ time
Usage: time [-apvV] [-f format] [-o file] [--append] [--verbose]
[--portability] [--format=format] [--output=file] [--version]
[--quiet] [--help] command [arg...]
$
Der Vorteil gegenüber z. B. alias time=/usr/bin/time
ist, dass Sie nicht den vollständigen Pfad zur time
Binärdatei angeben, sondern stattdessen auf den üblichen Pfadsuchmechanismus zurückgreifen.
Der alias
Befehl selbst kann zB in ~ / .bashrc oder /etc/bash.bashrc abgelegt werden (letzteres ist global für alle Benutzer im System).
Für den umgekehrten Fall (Erzwingen der Verwendung der integrierten Shell, falls ein Alias definiert ist) würden Sie so etwas wie verwenden builtin time
, das wiederum den üblichen Suchprozess außer Kraft setzt und die integrierte benannte Shell ausführt. In der Bash-Manpage wird erwähnt, dass dies häufig verwendet wird, um benutzerdefinierte cd
Funktionen mit einer Funktion namens bereitzustellen cd
, die wiederum die eingebaute Funktion verwendet cd
, um die eigentliche Aufgabe zu erledigen.
type -a <cmd>
.command
umgeht keine Builtins (außerzsh
wenn keine anderen Shells emuliert werden). Es umgeht Funktionen und das ist der Hauptgrund für seine Existenz. Seine zweite Aufgabe ist es, das Besondere an besonderen Einbauten zu entfernen . Aliase und Schlüsselwörter werden nurzsh
umgangen, weil diese nur an erster Stelle erweitert werden ( z. B. werden globale Aliase nicht umgangen). Es ist keinetime
Bash eingebaut.time
ist ein Schlüsselwort, das Sie zum Beispiel tun könnentime { foo; bar; }
.command
funktioniert in diesem speziellen Fall, wie am Beispiel gezeigt, aber offensichtlich ist eine richtige Antwort besser als eine halb richtige.builtin time
funktioniert nicht'time' echo test
Es gibt eine Abkürzung in Bash, um Schlüsselwörter zu umgehen, ohne einen Pfad angeben oder einen anderen eingebauten verwenden zu müssen, wie
command
: Escape mit einem Backslash.Persönlich finde ich das lesbarer und sicherer, da dies möglich ist:
quelle
time
tun:ti\me
,'time'
,ti""me
,ti${-##*}me
,${-+time}
... Das gilt für jede Shell - Schlüsselwort.(x_x)
Die allgemeinen Lösungen für integrierte Funktionen (zum Beispiel Test) sind [1] :
Verwenden Sie
env
(alle Muscheln)deaktiviere das eingebaute (nur bash und zsh):
Verwenden Sie einen beliebigen Schrägstrich
/
, um den Befehl aufzurufen (alle Shells):Erstelle einen Alias (schlägt in einem Bash-Skript fehl, außer wenn
shopt -s expand_aliases
verwendet):Aber die Zeit ist nicht eingebaut.
Das Wort
time
ist ein "reserviertes Wort", kein Befehl und auch kein eingebautes Wort. Das ermöglicht diese Lösungen:Zitiere das Wort. Dies funktioniert nicht mit eingebauten Funktionen.
Viele Formen der Zitierarbeit:
\time
"time"
'time'
ti\me
ti"me"
usw.Dies ist nützlich, um einen Alias zu umgehen. Auch wenn
test
ein Alias vorliegt,\test
wird der Befehl PATHed ausgeführt (oder der eingebaute Befehl, falls er nicht deaktiviert wurde).Verwenden Sie das eingebaute
command
(dies funktioniert nicht mit eingebauten):Wie oben für eingebaute Funktionen, mit beliebigen Schrägstrichen
/
:Wie oben bei den eingebauten Funktionen funktioniert auch hier ein Alias:
[1] Nehmen wir an, es gibt eine externe ausführbare Datei
~/bin/test
, die "external test" ausgibt. Und weiter: Nehmen wir an, dass wir im aktiven PATH einen~/bin
Vorsprung haben/bin
.quelle
Legen Sie dies in Ihrem
~/.bashrc
:alias time=/usr/bin/time
quelle
Mit dem
enable
Befehl können Sie bestimmte integrierte Funktionen deaktivieren.Da
time
es sich jedoch um ein Schlüsselwort handelt, funktioniert dies nicht.Sie müssen also einen Alias erstellen, um ihn zu überschreiben:
quelle