
$ 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
time
Als 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/time
ausführbare Datei.
Tatsächlich time
gibt es keinereserviertes WortInPOSIX-Shell(obwohl bash es erkennt inPOSIX-Modus(sofern nicht -
aus nicht offensichtlichen Gründen ein folgt)).
Innerhalb eines eval
Ausdrucks 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