Parece que hay alguna inconsistencia que no puedo entender con respecto al bash shell.
Si ejecuto:
ls;date;time
Los resultados de las tres consultas se muestran en secuencia.
Sin embargo, al intercambiar la fecha y la hora, aparece un mensaje de error.
Entonces si ejecuto:
ls;time;date
el mensaje de error dice: bash: syntax error near unexpected token 'date'
.
¿Alguien puede explicar esto?
time;date
contradate;time
. Esto parece ser un problema con la canalizaciónbash
y el último carácter generado con latime
salida. 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]Respuestas:
El
time
comando en su canalización no es el/usr/bin/time
binario, sino el bashtime
incorporado. Compararman time
conhelp time
. El error que ve es que bash no puede analizartime
el argumento. Esto debe estar presente o ser una nueva línea. Es una nueva línea en su primer ejemplo pero ausente en el segundo.Por otro lado, si tuvieras que correr
o
donde las comillas
'time'
revocan su estado como una palabra reservada, entonces bash no tiene problemas al analizar la línea. Ahora analiza tres comandos en una lista, que ejecutará en secuencia, e/usr/bin/time
informará un error de uso en cualquier caso.Apéndice
Se observó que aunque
time ; date
produce un error,time ; ; date
no lo hace. La explicación probable es quetime ;
bash interpreta que es equivalente atime <newline>
. La expresióntime ; ; date
se analiza luego como la lista detime ;
ydate
.Esto es coherente con la observación de que
time ;
y tambiéntime ; ;
son legales, el segundo se analiza como la lista de singleton que contienetime ;
seguido del punto y coma opcional permitido después de las listas.Entonces, otra forma de explicar por qué
time ; date
produce el errorbash: syntax error near unexpected token 'date'
es quetime
consume el punto y coma que lo separadate
. Solo puede hacer eso porquetime
es una palabra reservada bash.fuente
time
se supone que permite un comando NULL, y se supone que el punto y coma delimita las listas, por lo que eltime
comando IMO no debe "consumir" el punto y coma después de él. Otros comandos incorporados (que pueden tomar argumentos) no exhiben este tipo de comportamiento.time;date
hecho, es sintácticamente incorrecto en cualquier interpretación. Sin embargotime ;
ytime ; ;
luego también sería ilegal. Se puede debatir sitime
el comportamiento es un error o simplemente no documentado ( es coherente internamente), pero un informe de error definitivamente estaría en su lugar. ¿Estarías dispuesto a archivarlo?time by itself can time a null command
y luego lo hace$$ = make_simple_command (x, (COMMAND *)NULL);
. En cuanto a la presentación de un error, no estoy seguro 8)time ; date
funciona enksh93
ymksh
sin errores, a pesar de queksh
hay unatime
palabra clave.Bash trata el incorporado
time
como 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:
donde está una tubería:
o en nuestro caso, simplemente:
es decir, si el tiempo está presente, entonces el comando también debe estar presente.
[Hay un caso especial que permite
time
ser seguido por una nueva línea, pero eso no se aplica aquí]Entonces, en nuestro caso, tenemos:
dividido en dos tuberías:
y la tubería 1 no está bien formada, ya que tenemos
time
sin un comando. De ahí el error.Tenga en cuenta que la línea de comandos
time
tampoco funciona aquí:bash analiza esto como se esperaba, en 2 canales:
y
/usr/bin/time
luego se niega a correr sin argumento. Tenga en cuenta que este es un error de/usr/bin/time
no un error de bash.La razón por la que funciona el retroceso es que el retroceso deja de
time
ser interpretado como un elemento especial dentro de la tubería.es decir, con la marca de retroceso:
se analiza como dos tuberías:
Recuerde que una tubería, en nuestro caso, es:
y el problema inicialmente fue que teníamos
time
sin comando, lo cual no está permitido Pero ahora simplemente tenemos el comando:sin lo anterior
time
, ya que los ticks de retroceso significan quetime
se interpreta como el comando, no como una palabra anterior.Entonces bash ejecuta su construcción
time
sin argumentos, lo cual es aceptado. No produce salida, y no vemos ningún error.Tenga en cuenta que:
en realidad ejecuta el resultado del
time
incorporado, es decir, ejecuta lo que eltime
incorporado produce en stdout. Pero dado quetime
por sí solo no escribe nada para stdout, parece funcionar.Finalmente, se ha notado que esto funciona:
que no puedo explicar, lamentablemente :)
fuente
;date
dabash: syntax error near unexpected token ;
, perotime ;date
dabash: syntax error near unexpected token date
, por lo que parece que bash no trata el comando después del tiempo incorporado como "; fecha". Curiosamente,time ; ; date
funciona.'time'
, pierde su significado como palabra reservada. Hacer retroceso lo hace ejecutar en una subshell cuya salida se empalma en el comando. Esto no tiene nada que ver con la discusión. De hecho, su ejemplo`time\';date
demuestra lo contrario de su reclamo: esto debería dar un error en su razonamiento porque/usr/bin/time
requiere un argumento. La razón por la que no lo hace es porque en la subshell en la que se ejecuta es la palabra reservadatime
una vez más.