Saya ingin timeperintah yang terdiri dari dua perintah terpisah dengan satu keluaran perpipaan ke yang lain. Misalnya, perhatikan dua skrip di bawah ini:
$ cat foo.sh
#!/bin/sh
sleep 4
$ cat bar.sh
#!/bin/sh
sleep 2
Sekarang, bagaimana saya bisa timemelaporkan waktu yang diperlukan foo.sh | bar.sh(dan ya, saya tahu pipa itu tidak masuk akal di sini, tetapi ini hanya sebuah contoh)? Itu berfungsi seperti yang diharapkan jika saya menjalankannya secara berurutan dalam subkulit tanpa memipis:
$ time ( foo.sh; bar.sh )
real 0m6.020s
user 0m0.010s
sys 0m0.003s
Tapi saya tidak bisa membuatnya bekerja ketika memiploskan:
$ time ( foo.sh | bar.sh )
real 0m4.009s
user 0m0.007s
sys 0m0.003s
$ time ( { foo.sh | bar.sh; } )
real 0m4.008s
user 0m0.007s
sys 0m0.000s
$ time sh -c "foo.sh | bar.sh "
real 0m4.006s
user 0m0.000s
sys 0m0.000s
Saya sudah membaca pertanyaan serupa ( Bagaimana menjalankan waktu pada banyak perintah DAN menulis waktu keluaran ke file? ) Dan juga mencoba timedieksekusi mandiri :
$ /usr/bin/time -p sh -c "foo.sh | bar.sh"
real 4.01
user 0.00
sys 0.00
Bahkan tidak berfungsi jika saya membuat skrip ketiga yang hanya menjalankan pipa:
$ cat baz.sh
#!/bin/sh
foo.sh | bar.sh
Dan waktu itu:
$ time baz.sh
real 0m4.009s
user 0m0.003s
sys 0m0.000s
Menariknya, itu tidak muncul seolah-olah timekeluar segera setelah perintah pertama selesai. Jika saya berubah bar.shmenjadi:
#!/bin/sh
sleep 2
seq 1 5
Dan sekali timelagi, saya mengharapkan timehasilnya akan dicetak sebelum seqtetapi tidak:
$ time ( { foo.sh | bar.sh; } )
1
2
3
4
5
real 0m4.005s
user 0m0.003s
sys 0m0.000s
Sepertinya timetidak menghitung waktu yang diperlukan untuk mengeksekusi bar.shmeskipun menunggu sampai selesai sebelum mencetak laporannya 1 .
Semua tes dijalankan pada sistem Arch dan menggunakan bash 4.4.12 (1) -release. Saya hanya dapat menggunakan bash untuk proyek ini adalah bagian dari jadi bahkan jika zshatau beberapa shell kuat lainnya dapat mengatasinya, itu tidak akan menjadi solusi yang layak untuk saya.
Jadi, bagaimana saya bisa mendapatkan waktu yang dibutuhkan seperangkat perintah pipa untuk dijalankan? Dan, sementara kita melakukannya, mengapa itu tidak berhasil? Sepertinya timesegera keluar segera setelah perintah pertama selesai. Mengapa?
Saya tahu saya bisa mendapatkan waktu individu dengan sesuatu seperti ini:
( time foo.sh ) 2>foo.time | ( time bar.sh ) 2> bar.time
Tapi saya masih ingin tahu apakah mungkin mengatur waktu semuanya sebagai satu operasi.
1 Ini sepertinya bukan masalah penyangga, saya mencoba menjalankan skrip dengan unbuffereddan stdbuf -i0 -o0 -e0dan angkanya masih dicetak sebelum timehasilnya.