Bash behandelt das Integrierte time
als Sonderfall beim Parsen von Befehlszeilen.
Wie in der Bash-Manpage zu lesen ist, wird die eingegebene Zeile zunächst in eine Liste aufgeteilt:
pipeline ; pipeline
wo sich eine Pipeline befindet:
[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]
oder in unserem Fall einfach:
time command
dh wenn Zeit vorhanden ist, muss auch ein Befehl vorhanden sein.
[Es gibt einen Sonderfall, time
in dem eine neue Zeile folgen kann, der hier jedoch nicht gilt.]
In unserem Fall haben wir also:
time;date
in zwei Pipelines aufgeteilt werden:
1. time
2. date
und Pipeline 1 ist nicht gut ausgebildet, da wir time
ohne Befehl haben. Daher der Fehler.
Beachten Sie, dass die Befehlszeile auch time
hier nicht funktioniert:
$ /usr/bin/time;date
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
bash analysiert dies wie erwartet in 2 Pipelines:
1. /usr/bin/time
2. date
und /usr/bin/time
weigert sich dann, ohne Argument zu laufen. Beachten Sie, dass dies ein Fehler ist, /usr/bin/time
nicht ein Fehler von bash.
Der Grund dafür, dass Back-Tick funktioniert, ist, dass das Back-Tick nicht time
mehr als spezielles Element in der Pipeline interpretiert wird.
dh mit dem Back-Tick:
`time`;date
Es wird als zwei Pipelines analysiert:
1. `time`
2. date
Denken Sie daran, dass eine Pipeline in unserem Fall wie folgt lautet:
[time] command
und das problem war anfangs, dass wir time
ohne befehl hatten, was nicht erlaubt ist. Aber jetzt haben wir einfach den Befehl:
`time`
ohne das Vorhergehende time
, da die Back-Ticks bedeuten, dass dies time
als Befehl und nicht als Vorgängerwort interpretiert wird.
Bash führt dann sein eingebautes System time
ohne Argumente aus, was akzeptiert wird. Es wird keine Ausgabe erzeugt, und wir sehen keinen Fehler.
Beachten Sie, dass:
`time`
führt tatsächlich das Ergebnis des time
eingebauten Systems aus, dh es wird ausgeführt, was auch immer das time
eingebaute auf stdout erzeugt. Aber da time
alleine nichts zu stdout schreibt, scheint es zu funktionieren.
Schließlich wurde festgestellt, dass dies funktioniert:
time ; ; date
was ich leider nicht erklären kann :)
time;date
vsdate;time
. Dies scheint ein Problem mit der Pipelinebash
und dem zuletzt mit dertime
Ausgabe generierten Zeichen zu sein. Getestete Ergebnisse in verschiedenen Terminalemulatoren sind: - [Bash] $ Datum; Zeit # [OK] $ Zeit; Datum # [ NotOK ] Bash: Syntaxfehler in der Nähe des unerwarteten Tokens "Datum" $ Zeit # Nur Fehler erscheint nicht, dass es das ist Ergebnis eines beliebigen Datums. - [Csh] $ Datum; Uhrzeit # [OK] $ Uhrzeit; Datum # [OK] - [Tcsh] $ Datum; Uhrzeit # [OK] $ Uhrzeit; Datum # [OK] - [Ksh] $ Datum; Uhrzeit # [ OK] $ Zeit; Datum # [OK]