Bash considera l'integrato timecome un caso speciale quando analizza le righe di comando.
Come si può leggere nella manpage di bash, la riga digitata viene prima suddivisa in un elenco:
pipeline ; pipeline
dove si trova una conduttura:
[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]
o nel nostro caso, semplicemente:
time command
cioè se il tempo è presente, allora deve essere presente anche il comando .
[Esiste un caso speciale che consente timedi essere seguito da una nuova riga, ma che non si applica qui]
Quindi, nel nostro caso, abbiamo:
time;date
essere diviso in due condotte:
1. time
2. date
e la pipeline 1 non è ben formata, poiché abbiamo timesenza un comando. Da qui l'errore.
Nota che la riga di comando timenon funziona neanche qui:
$ /usr/bin/time;date
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
bash analizza questo come previsto, in 2 pipeline:
1. /usr/bin/time
2. date
e /usr/bin/timepoi si rifiuta di correre senza argomenti. Si noti che questo è un errore /usr/bin/timenon un errore di bash.
Il motivo per cui il back-tick funziona è che il back-tick smette di timeessere interpretato come un elemento speciale all'interno della pipeline.
cioè con il segno di spunta posteriore:
`time`;date
viene analizzato come due condutture:
1. `time`
2. date
Ricorda che una pipeline, nel nostro caso, è:
[time] command
e inizialmente il problema era che non avevamo timecomandi, il che non è permesso. Ma ora abbiamo semplicemente il comando:
`time`
senza il precedente time, poiché i segni di spunta indietro significano che timeviene interpretato come il comando, non come una parola precedente.
Quindi bash esegue il suo builtin timesenza argomenti, il che è accettato. Non produce output e non vediamo errori.
Nota che:
`time`
esegue effettivamente il risultato del timebuilt-in, ovvero esegue qualunque cosa il timebuilt-in produca su stdout. Ma poiché timeda solo non scrive nulla su stdout, sembra funzionare.
Infine, è stato notato che funziona:
time ; ; date
che non posso spiegare, purtroppo :)
time;datevsdate;time. Questo sembra essere un problema con la pipeline inbashe l'ultimo carattere generato con l'timeoutput. I risultati testati in diversi emulatori di terminale sono: - [Bash] $ date; time # [OK] $ time; date # [ NotOK ] bash: errore di sintassi vicino al token imprevisto `date '$ time # solo l'errore non sembra che sia il risultato di qualsiasi data. - [Csh] $ data; ora # [OK] $ ora; data # [OK] - [Tcsh] $ data; ora # [OK] $ ora; data # [OK] - [Ksh] $ data; ora # [ OK] $ ora; data # [OK]