GNU/Linux >> Tutoriales Linux >  >> Linux

¿Diferencias entre la palabra reservada y el comando 'tiempo' en el shell integrado, la función, la canalización y la lista de comandos?

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 . Un
time externo el comando no puede cronometrarlos fácilmente.

  1. ¿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 de time? ? Por ejemplo, ¿cómo los analiza o interpreta bash shell
    de manera diferente?

    ¿O esto solo se limita al caso de time? ?

  2. 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
    
  3. 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
    
  4. 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.

Relacionado:¿Descifrar OS X Time Machine en Linux?

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 .


Linux
  1. ¿Diferencia entre Shell de inicio de sesión y Shell sin inicio de sesión?

  2. ¿Diferencia entre tubería y expansión de comando?

  3. ¿Diferencias entre volumen, partición y disco?

  4. ¿Diferencias entre Sed en Mac Osx y otros Sed "estándar"?

  5. Diferencias entre cortafuegos de hardware y software

25 Preguntas y respuestas de la entrevista de secuencias de comandos de Linux Shell

Comando Ls en Linux (Lista de archivos y directorios)

Cómo enumerar usuarios y grupos en Linux

Vim vs Vi:¿similitudes y diferencias entre VIM y VI?

Comando para listar todos los archivos excepto . (punto) y .. (punto punto)

¿Diferencia entre '{}' y {} en el comando de búsqueda?