Dalam Manual Referensi Bash,
Penggunaan
time
sebagai kata yang dicadangkan memungkinkan pengaturan waktu bawaan shell , fungsi cangkang , dan pipa . Sebuahtime
external eksternal perintah tidak dapat mengatur waktu ini dengan mudah.
-
Bisakah Anda menjelaskan mengapa kutipannya mengatakan demikian?
Apakah ini karena perbedaan antara kata yang dicadangkan dan perintah
, tidak hanya terbatas pada kasustime
? Misalnya, bagaimana bash shell
mengurai atau menafsirkannya secara berbeda?Atau ini hanya terbatas pada kasus
time
? -
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
-
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
-
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.
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 .