GNU/Linux >> Belajar Linux >  >> Linux

Perbedaan Antara `waktu` Kata dan Perintah yang Dicadangkan Pada Builtin Shell, Fungsi, Saluran Pipa, dan Daftar Perintah?

Dalam Manual Referensi Bash,

Penggunaan time sebagai kata yang dicadangkan memungkinkan pengaturan waktu bawaan shell , fungsi cangkang , dan pipa . Sebuah
time external eksternal perintah tidak dapat mengatur waktu ini dengan mudah.

  1. Bisakah Anda menjelaskan mengapa kutipannya mengatakan demikian?

    Apakah ini karena perbedaan antara kata yang dicadangkan dan perintah
    , tidak hanya terbatas pada kasus time ? Misalnya, bagaimana bash shell
    mengurai atau menafsirkannya secara berbeda?

    Atau ini hanya terbatas pada kasus time ?

  2. Dalam contoh berikut,

    mengapa time eksternal bekerja pada shell builtin, dan
    pipeline, sementara kutipan mengatakan "tidak dapat mengatur waktu ini dengan mudah"?

    time eksternal di di dalam shell :

    $ /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 eksternal di pipa :

    $ /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. Dalam contoh berikut, mengapa time eksternal pada fungsi
    shell
    gagal? Apa arti dari keluaran kesalahannya?

    $ 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. Tampaknya kutipan tidak hanya berlaku untuk pengaturan waktu bawaan shell,
    fungsi shell, dan saluran pipa, tetapi juga untuk pengaturan waktu sekelompok
    perintah
    :

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

    Mengapa shell mengatakan "bash:kesalahan sintaksis di dekat token yang tidak terduga
    } ” untuk perintah /usr/bin/time ?

Jawaban yang Diterima:

Di bash , time adalah kata yang dicadangkan, sehingga shell dapat menguraikannya dengan caranya sendiri dan menerapkan aturan untuknya.

Berikut adalah kode yang menunjukkan bagaimana bash parse baris dimulai dengan time kata cadangan:

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

Anda lihat, time dapat diikuti oleh sebagian besar bash lainnya kata-kata yang dicadangkan.

Terkait:Dekripsi OS X Time Machine di Linux?

Dalam kasus perintah eksternal, aturan normal diterapkan, { dianggap sebagai input /usr/bin/time . } saja adalah token yang tidak valid, dan bash tingkatkan kesalahannya.

Dalam:

/usr/bin/time echo hello

time eksternal tidak memanggil echo bawaan shell tetapi echo eksternal perintah.

Sebuah strace memverifikasi bahwa:

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

Di sini time eksternal cari PATH . Anda variabel untuk menemukan perintah yang dapat dieksekusi. Itu juga menjelaskan jika menggunakan suatu fungsi, Anda mendapatkan Tidak ada file atau direktori seperti itu karena tidak ada perintah bernama mytest di PATH . Anda .


Linux
  1. Perbedaan Antara Perintah Bawaan Dan Yang Tidak?

  2. Perbedaan Antara Sed Di Mac Osx Dan Sed "standar" Lainnya?

  3. Dapatkan daftar nama fungsi dalam skrip shell

  1. Perbedaan antara CLOCK_REALTIME dan CLOCK_MONOTONIC?

  2. Perintah untuk membuat daftar semua file kecuali . (titik) dan .. (titik titik)

  3. Apa perbedaan antara &> dan >&di bash?

  1. Perbedaan Antara Editor Teks Vi Dan Vim Dijelaskan

  2. Perbedaan antara cp -r dan cp -R (perintah salin)

  3. Perbedaan antara 'man ls' dan 'ls --help'?