En el Manual de referencia de Bash,
El uso del time
como palabra reservada permite la temporización de construcciones de shell , funciones de shell y tuberías . Untime
externo el comando no puede cronometrarlos fácilmente.
-
¿Podría explicar por qué la cita dice eso?
¿Es esto debido a la diferencia entre una palabra reservada y un comando
, no solo limitado al caso detime
? ? Por ejemplo, ¿cómo los analiza o interpreta bash shell
de manera diferente?¿O esto solo se limita al caso de
time
? ? -
En los siguientes ejemplos,
¿Por qué el
time
externo trabajar en un shell integrado y una tubería
, mientras que la cita dice "no se puede cronometrar esto fácilmente"?time
externo en un shell integrado :$ /usr/bin/time echo hello hello 0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 1676maxresident)k 0inputs+0outputs (0major+78minor)pagefaults 0swaps
time
externo en una canalización :$ /usr/bin/time sleep 10 | sleep 5 0.00user 0.00system 0:10.00elapsed 0%CPU (0avgtext+0avgdata 1776maxresident)k 0inputs+0outputs (0major+79minor)pagefaults 0swaps
-
En el siguiente ejemplo, ¿por qué el
time
externo en una función de shell
¿fallar? ¿Qué significa su salida de error?$ function mytest () { sleep 10; } $ /usr/bin/time mytest /usr/bin/time: cannot run mytest: No such file or directory Command exited with non-zero status 127 0.00user 0.00system 0:00.03elapsed 0%CPU (0avgtext+0avgdata 1252maxresident)k 32inputs+0outputs (0major+30minor)pagefaults 0swaps
-
Parece que la cita no solo se aplica a las funciones integradas de shell de temporización,
funciones de shell y canalizaciones, sino también a la temporización de un grupo de
comandos :$ time { echo hello; sleep 3; echo tim; } hello tim real 0m3.002s user 0m0.000s sys 0m0.000s $ /usr/bin/time { echo hello; sleep 3; echo tim; } bash: syntax error near unexpected token `}'
¿Por qué el shell dice "bash:error de sintaxis cerca de un token inesperado
}
” en el caso del comando/usr/bin/time
?
Respuesta aceptada:
En bash
, time
es una palabra reservada, por lo que el shell puede analizarla a su manera y aplicarle reglas.
Aquí está el código que muestra cómo bash
la línea de análisis comienza con time
palabra reservada:
static int
time_command_acceptable ()
{
#if defined (COMMAND_TIMING)
int i;
if (posixly_correct && shell_compatibility_level > 41)
{
/* Quick check of the rest of the line to find the next token. If it
begins with a `-', Posix says to not return `time' as the token.
This was interp 267. */
i = shell_input_line_index;
while (i < shell_input_line_len && (shell_input_line[i] == ' ' || shell_input_line[i] == 't'))
i++;
if (shell_input_line[i] == '-')
return 0;
}
switch (last_read_token)
{
case 0:
case ';':
case 'n':
case AND_AND:
case OR_OR:
case '&':
case WHILE:
case DO:
case UNTIL:
case IF:
case THEN:
case ELIF:
case ELSE:
case '{': /* } */
case '(': /* )( */
case ')': /* only valid in case statement */
case BANG: /* ! time pipeline */
case TIME: /* time time pipeline */
case TIMEOPT: /* time -p time pipeline */
case TIMEIGN: /* time -p -- ... */
return 1;
default:
return 0;
}
#else
return 0;
#endif /* COMMAND_TIMING */
}
Ya ves, time
puede ser seguido por la mayoría de los demás bash
palabras reservadas.
En caso de comando externo, se aplicó la regla normal, {
se consideró entrada de /usr/bin/time
. }
solo es un token no válido, y bash
plantear el error.
en:
/usr/bin/time echo hello
time
externo no llamó al shell incorporado echo
pero el echo
externo comando.
Una strace
verifica que:
$ strace -fe execve /usr/bin/time echo 1
execve("/usr/bin/time", ["/usr/bin/time", "echo", "1"], [/* 64 vars */]) = 0
Process 25161 attached
....
[pid 25161] execve("/usr/bin/echo", ["echo", "1"], [/* 64 vars */]) = -1 ENOENT (No such file or directory)
[pid 25161] execve("/bin/echo", ["echo", "1"], [/* 64 vars */]) = 0
1
[pid 25161] +++ exited with 0 +++
....
Aquí time
externo busca tu PATH
variable para encontrar el comando ejecutable. Eso también explica que en caso de usar una función, tienes No existe tal archivo o directorio porque no hay un comando llamado mytest
en tu PATH
.