GNU/Linux >> Linux Esercitazione >  >> Linux

Differenze tra la parola riservata e il comando `time` su Shell Builtin, funzione, pipeline e elenco di comandi?

Nel Manuale di riferimento di Bash,

L'uso di time poiché una parola riservata consente la tempistica dei integrati della shell , funzioni della shell e condutture . Un
time esterno il comando non può cronometrarli facilmente.

  1. Potresti spiegare perché la citazione dice questo?

    È questo a causa della differenza tra una parola riservata e un comando
    , non solo limitato al caso di time ? Ad esempio, in che modo la shell bash
    li analizza o li interpreta in modo diverso?

    O è solo limitato al caso di time ?

  2. Negli esempi seguenti,

    perché il time esterno lavorare su una shell incorporata e una pipeline
    , mentre la citazione dice che "non è possibile cronometrarli facilmente"?

    time esterna su una shell incorporata :

    $ /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 esterna su una pipeline :

    $ /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. Nell'esempio seguente, perché il time esterno su una funzione shell
    fallire? Che cosa significa il suo output di errore?

    $ 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. Sembra che la citazione non si applichi solo ai builtin della shell di temporizzazione,
    funzioni della shell e pipeline, ma anche alla temporizzazione di un gruppo di
    comandi
    :

    $ 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 `}'
    

    Perché la shell dice "bash:errore di sintassi vicino a token imprevisto
    } ” nel caso del comando /usr/bin/time ?

Risposta accettata:

In bash , time è una parola riservata, quindi la shell può analizzarla a modo suo e applicarvi regole.

Ecco il codice mostra come bash la riga di analisi inizia con time parola riservata:

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 */
}

Vedi, time può essere seguito dalla maggior parte degli altri bash parole riservate.

Correlati:Decrittografare OS X Time Machine in Linux?

In caso di comando esterno è stata applicata la normale regola, { è stato considerato input di /usr/bin/time . } da solo è un token non valido e bash sollevare l'errore.

In:

/usr/bin/time echo hello

time esterna non ha chiamato la shell incorporata echo ma l'echo esterno comando.

Una strace verifica che:

$ 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 +++
....

Qui esterno time cerca il tuo PATH variabile per trovare il comando eseguibile. Questo spiega anche in caso di utilizzo di una funzione, hai Nessun file o directory di questo tipo perché non esiste un comando chiamato mytest nel tuo PATH .


Linux
  1. Differenza tra shell di accesso e shell non di accesso?

  2. Differenza tra tubazioni ed espansione dei comandi?

  3. Ottieni un elenco di nomi di funzioni in uno script di shell

  4. Differenze sub-shell tra bash e ksh

  5. Comando per elencare tutti i file tranne . (punto) e .. (punto punto)

25 Domande e risposte sull'intervista sugli script della shell di Linux

Comando Ls in Linux (Elenca file e directory)

Spiegazione delle differenze tra editor di testo Vi e Vim

Come elencare utenti e gruppi su Linux

Vim vs Vi:somiglianze e differenze tra VIM e VI?

Differenza tra 'man ls' e 'ls --help'?