Bash trata el incorporado timecomo un caso especial, al analizar líneas de comando.
Como se puede leer en la página de manual de bash, la línea escrita se divide primero en una lista:
pipeline ; pipeline
donde está una tubería:
[time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]
o en nuestro caso, simplemente:
time command
es decir, si el tiempo está presente, entonces el comando también debe estar presente.
[Hay un caso especial que permite timeser seguido por una nueva línea, pero eso no se aplica aquí]
Entonces, en nuestro caso, tenemos:
time;date
dividido en dos tuberías:
1. time
2. date
y la tubería 1 no está bien formada, ya que tenemos timesin un comando. De ahí el error.
Tenga en cuenta que la línea de comandos timetampoco funciona aquí:
$ /usr/bin/time;date
Usage: /usr/bin/time [-apvV] [-f format] [-o file] [--append] [--verbose]
bash analiza esto como se esperaba, en 2 canales:
1. /usr/bin/time
2. date
y /usr/bin/timeluego se niega a correr sin argumento. Tenga en cuenta que este es un error de /usr/bin/timeno un error de bash.
La razón por la que funciona el retroceso es que el retroceso deja de timeser interpretado como un elemento especial dentro de la tubería.
es decir, con la marca de retroceso:
`time`;date
se analiza como dos tuberías:
1. `time`
2. date
Recuerde que una tubería, en nuestro caso, es:
[time] command
y el problema inicialmente fue que teníamos timesin comando, lo cual no está permitido Pero ahora simplemente tenemos el comando:
`time`
sin lo anterior time, ya que los ticks de retroceso significan que timese interpreta como el comando, no como una palabra anterior.
Entonces bash ejecuta su construcción timesin argumentos, lo cual es aceptado. No produce salida, y no vemos ningún error.
Tenga en cuenta que:
`time`
en realidad ejecuta el resultado del timeincorporado, es decir, ejecuta lo que el timeincorporado produce en stdout. Pero dado que timepor sí solo no escribe nada para stdout, parece funcionar.
Finalmente, se ha notado que esto funciona:
time ; ; date
que no puedo explicar, lamentablemente :)
time;datecontradate;time. Esto parece ser un problema con la canalizaciónbashy el último carácter generado con latimesalida. Los resultados probados en diferentes emuladores de terminal son: - [Bash] $ date; time # [OK] $ time; date # [ NotOK ] bash: error de sintaxis cerca del token inesperado `date '$ time # solo el error no parece ser el resultado de cualquier fecha. - [Csh] $ date; time # [OK] $ time; date # [OK] - [Tcsh] $ date; time # [OK] $ time; date # [OK] - [Ksh] $ date; time # [ OK] $ time; fecha # [OK]