Bash behandelt das Integrierte timeals 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, timein 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 timeohne Befehl haben. Daher der Fehler.
Beachten Sie, dass die Befehlszeile auch timehier 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/timeweigert sich dann, ohne Argument zu laufen. Beachten Sie, dass dies ein Fehler ist, /usr/bin/timenicht ein Fehler von bash.
Der Grund dafür, dass Back-Tick funktioniert, ist, dass das Back-Tick nicht timemehr 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 timeohne 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 timeals Befehl und nicht als Vorgängerwort interpretiert wird.
Bash führt dann sein eingebautes System timeohne 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 timeeingebauten Systems aus, dh es wird ausgeführt, was auch immer das timeeingebaute auf stdout erzeugt. Aber da timealleine 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;datevsdate;time. Dies scheint ein Problem mit der Pipelinebashund dem zuletzt mit dertimeAusgabe 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]