time
menulis ke stderr
, jadi orang akan menganggap bahwa menambahkan 2>&1
ke baris perintah harus merutekan outputnya stdout
. Tetapi ini tidak berhasil:
test@debian:~$ cat file
one two three four
test@debian:~$ time wc file > wc.out 2>&1
real 0m0.022s
user 0m0.000s
sys 0m0.000s
test@debian:~$ cat wc.out
1 4 19 file
Hanya dengan tanda kurung ia berfungsi:
test@debian:~$ (time wc file) > wc.out 2>&1
test@debian:~$ cat wc.out
1 4 19 file
real 0m0.005s
user 0m0.000s
sys 0m0.000s
Mengapa tanda kurung diperlukan dalam kasus ini? Mengapa tidak time wc
ditafsirkan sebagai satu perintah tunggal ?
io-redirection
shell-builtin
serigala-revo-kucing
sumber
sumber
time
kata kunci shell, atau/usr/bin/time
. Mungkin ada beberapa set deskriptor yang terlibat di sini (shell, dan yang dilampirkan pada suatutime
proses). Dan jangan lupa tentang yang tersirat dalam()
subkulit. ( menunggu spesialis bash : p)Jawaban:
Dalam
ksh
,bash
danzsh
,time
bukan perintah (builtin atau tidak), itu kata reserved dalam bahasa sepertifor
atauwhile
.Ini digunakan untuk mengatur waktu pipa 1 .
Di:
Anda memiliki sintaks khusus yang memberi tahu shell untuk menjalankan saluran pipa itu:
Dan melaporkan statistik waktu untuk itu.
Di:
Ini sama, Anda waktu yang
cmd > output 2> error
perintah, dan statistik waktu masih terus stderr shell.Anda membutuhkan:
Atau:
Untuk stderr shell yang akan diarahkan ke
timing-output
sebelum waktu membangun (sekali lagi, bukan perintah ) digunakan (di sini ke waktucmd > output 2> error 3>&-
).Anda juga dapat menjalankan
time
konstruk tersebut dalam subkulit yang stderrnya dialihkan:Tapi subkulit itu tidak diperlukan di sini, Anda hanya perlu stderr untuk diarahkan pada saat
time
konstruksi dipanggil.Sebagian besar sistem juga memiliki
time
perintah. Anda dapat memanggil yang itu dengan menonaktifkantime
kata kunci. Yang perlu Anda lakukan adalah mengutip kata kunci itu, entah bagaimana, sebagai kata kunci, hanya dikenali saat harfiah.Namun berhati-hatilah formatnya mungkin berbeda dan stderr keduanya
time
dancmd
akan digabung menjadierror-and-timing-output
.Juga,
time
perintah, sebagai lawantime
konstruk tidak dapat mengatur waktu pipa atau perintah majemuk atau fungsi atau builtin shell ...Jika itu adalah perintah builtin, itu mungkin bisa mengatur waktu fungsi atau builtin, tetapi tidak bisa mengatur waktu pengalihan atau jalur pipa atau perintah majemuk.
1 Catatan yang
bash
memiliki (apa yang dapat dianggap sebagai) bug di manatime (cmd) 2> file
(tetapi tidaktime cmd | (cmd2) 2> file
misalnya) mengarahkan kembali output waktu kefile
sumber
time
adalah kata kunci, bukan shell builtin.'time'
untuk mendapatkan file executable-- handier daripada menulis/usr/bin/time
(atau bahkancommand time
:-)).\time
.Tidak ada perintah yang bernama
time wc
,time
danwc
dipisahkan kata dalam shell.Sekarang, sering ada dua program terpisah bernama
time
, yang satu adalah kata kunci shell, yang lain adalah perintah eksternal . Dalam shell yangtime
merupakan kata kunci shell, saat Anda mengetiktime wc ...
, shell menggunakan kata kuncitime
alih-alih utilitas waktu eksternal .Ketika shell menggunakan
time
kata kunci, itu tidak perlu fork () proses baru,time
standar saat ini dan kesalahan standar tidak berubah. Bagian pengalihan dalam:wc
hanya mempengaruhi .Saat Anda menggunakan perintah majemuk
(list)
:shell berlari
time wc file
di dalam subkulit,(time wc file)
dianggap sebagai perintah tunggal , dan bagian pengalihan mempengaruhi output standar dan kesalahan standar, yang sekarang termasuk keduanyatime
danwc
.Anda dapat membuat efek yang sama, tanpa biaya forking proses baru dengan menggunakan bentuk lain dari perintah pengelompokan
{list;}
:Jika Anda menggunakan eksternal
time
, maka Anda tidak menghadapi masalah ini, karena dijalankan dalam proses baru:sumber
time
dan/usr/bin/time
? Apakah executable yang dipanggil secara fungsional sama?Karena
time
Anda mengeksekusi adalah bash builtin. Bash memprosesnya dengan cara khusus.Jika Anda akan menggunakan
time
biner nyata , itu akan bertindak persis seperti yang Anda harapkan:Meskipun output kali ini sedikit berbeda:
sumber
time cmd > output
kalicmd > output
perintah, dantime foo | bar
kalifoo | bar
.Bukan
time
yang menulis informasi waktu. Builtintime
membuat shell menulis ini setelah perintah selesai. Tetapi pengalihan hanya mempengaruhi perintah.Dalam
(time ...)
hal pengalihan diterapkan ke seluruh subkulit.sumber
Karena waktu adalah shell bawaan, ia menulis ke stderr shell , bukan stderr perintah.
Menggunakan tanda kurung memaksa seluruh perintah menjadi shell anak yang stderrnya dapat diarahkan.
menggunakan kurung keriting menghasilkan hasil yang serupa tanpa benar-benar memulai subkulit
(ya, Anda membutuhkan titik koma)
sumber