In Zeichenfolge integrierte Bash-Zeit wird nicht ausgeführt

In Zeichenfolge integrierte Bash-Zeit wird nicht ausgeführt
$ cmd='time sleep 2'
$ $cmd
bash: time: command not found

Was ist hier los? Es liegt nicht daran, dass Shell-Builtins nicht funktionieren, denn das hier funktioniert:

$ cmd2='echo wef'
$ $cmd2
wef

Irgendwelche Ideen?

Edit: Ich habe einen Unterschied gefunden:

$ type time
time is a shell keyword

Gegen:

$ type echo
echo is a shell builtin

Die Frage ist nun: Warum funktioniert ein integriertes Element in einer Zeichenfolge, ein Schlüsselwort jedoch nicht?

Antwort1

timeAls einGNU BashDas Schlüsselwort hat einen ganz bestimmten Ort, an dem es akzeptiert wird. Siehe beispielsweise die Syntax für die Konstruktion einer Befehlspipeline:

Das Format für eine Pipeline ist [time [-p]] [!] command1 [| command2 ...]

Dadurch wird die Position des Schlüsselworts außerhalb der Erweiterungen fest codiert (wieBefehlNwird dort sein, wo die Parameter und Variablen erweitert werden). Tatsächlich gilt auch die Semantik für die gesamte Pipeline, nicht für den Befehl. Das ist wahrscheinlich der Grund, warum es ein Schlüsselwort sein muss.

Es gibt eine Shell eingebaut times(in POSIX einspezielle eingebaute), hierfür funktioniert die Erweiterung, da das erste Wort eine ausführbare Datei oder ein Shell-Built-In sein kann.

AlternativeGNU-Kerndienstprogramme enthält eine /bin/timeausführbare Datei.

Tatsächlich timegibt es keinereserviertes WortInPOSIX-Shell(obwohl bash es erkennt inPOSIX-Modus(sofern nicht -aus nicht offensichtlichen Gründen ein folgt)).

Innerhalb eines evalAusdrucks werden Schlüsselwörter erkannt durchSchlag, sodass dies verwendet werden kann, um Befehle dynamisch mit Zeitprofilierung zu verbessern. (Allerdings erfordert es andererseits eine zusätzliche Anführungsrunde)

Antwort2

Anstelle von cmd='time sleep 2' versuchen Sie es als cmd='/usr/bin/time sleep 2' zu verwenden, um den Echtzeitbefehl zu erhalten.

Folgendes könnt ihr in der Mannzeit nachlesen:

Benutzer der Bash-Shell müssen einen expliziten Pfad verwenden, um den externen Zeitbefehl auszuführen und nicht die in der Shell integrierte Variante. Auf einem System, auf dem die Zeit in /usr/bin installiert ist, würde das erste Beispiel lauten: /usr/bin/time wc /etc/hosts

verwandte Informationen