Bash traktuje wbudowany timeelement jako specjalny przypadek podczas analizowania linii poleceń.
Jak można przeczytać na stronie podręcznika bash, wpisany wiersz jest najpierw dzielony na listę:
pipeline ; pipeline
gdzie rurociąg jest:
[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]
lub w naszym przypadku po prostu:
time command
tzn. jeśli czas jest obecny, polecenie musi być również obecne.
[Istnieje szczególny przypadek, który pozwala timena dodanie nowej linii, ale nie dotyczy to tutaj]
W naszym przypadku mamy:
time;date
podzielony na dwa rurociągi:
1. time
2. date
a rurociąg 1 nie jest dobrze uformowany, ponieważ mamy timebez polecenia. Stąd błąd.
Zauważ, że timetutaj również nie działa wiersz poleceń :
$ /usr/bin/time;date
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
bash analizuje to zgodnie z oczekiwaniami, w 2 potoki:
1. /usr/bin/time
2. date
a /usr/bin/timenastępnie odmawia uruchomienia bez argumentów. Zauważ, że jest to błąd wynikający z /usr/bin/timebłędu bash.
Powodem, dla którego działa tykanie wstecz jest to, że tykanie przestaje timebyć interpretowane jako specjalny element w potoku.
tj. z tyknięciem wstecz:
`time`;date
jest analizowany jako dwa potoki:
1. `time`
2. date
Pamiętaj, że rurociąg w naszym przypadku to:
[time] command
a problem początkowo polegał na tym, że nie mieliśmy timepolecenia, co jest niedozwolone. Ale teraz mamy po prostu polecenie:
`time`
bez poprzedzającego time, ponieważ znaczniki cofania oznaczają, że timejest interpretowane jako polecenie, a nie jako poprzedzające słowo.
Więc bash następnie uruchamia swoją wbudowaną wersję timebez argumentów, co jest akceptowane. Nie wytwarza danych wyjściowych i nie widzimy błędów.
Uwaga:
`time`
faktycznie prowadzi wynik z następujących timewbudowany, czyli działa bez względu na timewbudowaną produkuje na standardowe wyjście. Ale ponieważ timesam nie pisze niczego na standardowe wyjście, wydaje się, że działa.
Wreszcie zauważono, że to działa:
time ; ; date
czego niestety nie potrafię wyjaśnić :)
time;dateżywodate;time. Wydaje się, że jest to problem z wejściem do potokubashi ostatnim char generowanym ztimewyjściem. Testowane wyniki w różnych emulatorach terminali to: - [Bash] $ data; godzina # [OK] $ godzina; data # [ NotOK ] bash: błąd składni w pobliżu nieoczekiwanego tokena `data '$ czas # tylko błąd nie pojawia się, że jest to wynik dowolnej daty. - [Csh] $ data; godzina # [OK] $ godzina; data # [OK] - [Tcsh] $ data; godzina # [OK] $ godzina; data # [OK] - [Ksh] $ data; godzina # [ OK] $ godzina; data # [OK]