GNU/Linux >> Znalost Linux >  >> Linux

Rozdíly mezi rezervovaným slovem a příkazem `čas` ve sestaveném prostředí Shell, funkce, potrubí a seznam příkazů?

V Bash Reference Manual

Použití time jako vyhrazené slovo umožňuje načasování vestavěných prvků prostředí , funkce prostředí a potrubí . Externí
time příkaz je nemůže snadno načasovat.

  1. Mohl byste vysvětlit, proč to citát říká?

    Je to kvůli rozdílu mezi vyhrazeným slovem a příkazem
    , který není omezen pouze na případ time ? Jak je například bash shell
    analyzuje nebo interpretuje odlišně?

    Nebo je to omezeno pouze na případ time ?

  2. V následujících příkladech

    proč externí time pracovat na vestavěném shellu a
    potrubí, zatímco citát říká, že „toto nelze snadno načasovat“?

    Externí time na vestavěném prostředí :

    $ /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
    

    Externí time na potrubí :

    $ /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. V následujícím příkladu, proč externí time na funkci shell
    selhat? Co znamená jeho chybový výstup?

    $ 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. Zdá se, že citace se nevztahuje pouze na vestavěné moduly časování shellu,
    funkce shellu a potrubí, ale také na časování skupiny
    příkazů
    :

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

    Proč shell říká „bash:chyba syntaxe poblíž neočekávaného tokenu
    } ” v případě příkazu /usr/bin/time ?

Přijatá odpověď:

V bash , time je vyhrazené slovo, takže jej shell může analyzovat vlastním způsobem a aplikovat na něj pravidla.

Zde je kód, jak bash řádek analýzy začíná time vyhrazené slovo:

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

Vidíte, time může být následováno většinou ostatních bash vyhrazená slova.

Související:Dešifrovat OS X Time Machine v Linuxu?

V případě externího příkazu bylo použito normální pravidlo { byl považován za vstup /usr/bin/time . } samotný je neplatný token a bash upozornit na chybu.

V:

/usr/bin/time echo hello

externí time nezavolalo vestavěný shell echo ale externí echo příkaz.

strace ověřuje, že:

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

Zde externí time vyhledejte svou PATH proměnnou k vyhledání spustitelného příkazu. To také vysvětluje, že v případě použití funkce nemáte Žádný takový soubor nebo adresář protože neexistuje žádný příkaz s názvem mytest ve vaší PATH .


Linux
  1. Rozdíl mezi vestavěným příkazem a příkazem, který není?

  2. Rozdíly mezi svazkem, oddílem a diskem?

  3. Rozdíly mezi hardwarovými a softwarovými firewally

  1. Rozdíl mezi CLOCK_REALTIME a CLOCK_MONOTONIC?

  2. Sub-shell rozdíly mezi bash a ksh

  3. Příkaz pro výpis všech souborů kromě . (tečka) a .. (tečka tečka)

  1. Jaký je rozdíl mezi &> a >&v bash?

  2. Rozdíl mezi '{}' a {} v příkazu find?

  3. Rozdíl mezi 'man ls' a 'ls --help'?