Bash considera l'integrato time
come 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 time
di 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 time
senza un comando. Da qui l'errore.
Nota che la riga di comando time
non 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/time
poi si rifiuta di correre senza argomenti. Si noti che questo è un errore /usr/bin/time
non un errore di bash.
Il motivo per cui il back-tick funziona è che il back-tick smette di time
essere 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 time
comandi, il che non è permesso. Ma ora abbiamo semplicemente il comando:
`time`
senza il precedente time
, poiché i segni di spunta indietro significano che time
viene interpretato come il comando, non come una parola precedente.
Quindi bash esegue il suo builtin time
senza argomenti, il che è accettato. Non produce output e non vediamo errori.
Nota che:
`time`
esegue effettivamente il risultato del time
built-in, ovvero esegue qualunque cosa il time
built-in produca su stdout. Ma poiché time
da solo non scrive nulla su stdout, sembra funzionare.
Infine, è stato notato che funziona:
time ; ; date
che non posso spiegare, purtroppo :)
time;date
vsdate;time
. Questo sembra essere un problema con la pipeline inbash
e l'ultimo carattere generato con l'time
output. 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]