O Bash trata o interno timecomo um caso especial ao analisar linhas de comando.
Como pode ser lido na página de manual do bash, a linha digitada é primeiro dividida em uma lista:
pipeline ; pipeline
onde um pipeline é:
[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]
ou no nosso caso, simplesmente:
time command
ou seja, se o tempo estiver presente, o comando também deverá estar presente.
[Há um caso especial que permite timeser seguido por uma nova linha, mas que não se aplica aqui]
Então, no nosso caso, temos:
time;date
sendo dividido em dois pipelines:
1. time
2. date
e o pipeline 1 não está bem formado, pois temos timesem um comando. Daí o erro.
Observe que a linha de comando timetambém não funciona aqui:
$ /usr/bin/time;date
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
bash analisa isso conforme o esperado, em 2 pipelines:
1. /usr/bin/time
2. date
e /usr/bin/timedepois se recusa a executar sem nenhum argumento. Observe que este é um erro e /usr/bin/timenão um erro do bash.
O motivo pelo qual o back-tick funciona é que o back-tick deixa de timeser interpretado como um elemento especial dentro do pipeline.
ou seja, com o back-tick:
`time`;date
é analisado como dois pipelines:
1. `time`
2. date
Lembre-se de que um pipeline, no nosso caso, é:
[time] command
e o problema inicialmente era que tínhamos timesem comando, o que não é permitido. Mas agora simplesmente temos o comando:
`time`
sem o anterior time, pois os back-ticks significam que timeé interpretado como o comando, não como uma palavra anterior.
Então, o bash executa seu built time-in sem argumentos, o que é aceito. Não produz saída e não vemos erro.
Observe que:
`time`
realmente executa o resultado do timebuilt-in, ou seja, executa o que o timebuilt-in produz no stdout. Mas como, timepor si só, não escreve nada para o stdout, parece funcionar.
Por fim, observou-se que isso funciona:
time ; ; date
o que não posso explicar, infelizmente :)
time;datevsdate;time. Isso parece ser um problema com o pipelinebashe o último caractere gerado com atimesaída. Os resultados testados em diferentes emuladores de terminal são: - [Bash] $ date; time # [OK] $ time; date # [ NotOK ] bash: erro de sintaxe próximo ao token inesperado `date '$ time # apenas o erro não parece ser o resultado de qualquer data. - [Csh] $ data; hora # [OK] $ hora; data # [OK] - [Tcsh] $ data; hora # [OK] $ hora; data # [OK] - [Ksh] $ data; hora # [ OK] $ time; date # [OK]