time
Birine diğerine boru çıkışı olan iki ayrı komuttan oluşan bir komut istiyorum . Örneğin, aşağıdaki iki komut dosyasını göz önünde bulundurun:
$ cat foo.sh
#!/bin/sh
sleep 4
$ cat bar.sh
#!/bin/sh
sleep 2
Şimdi, time
geçen süreyi nasıl rapor edebilirim foo.sh | bar.sh
(ve evet, borunun burada bir anlamı olmadığını biliyorum, ama bu sadece bir örnek)? Boruları olmadan bir alt kabukta sırayla çalıştırırsam beklendiği gibi çalışır:
$ time ( foo.sh; bar.sh )
real 0m6.020s
user 0m0.010s
sys 0m0.003s
Ancak boru tesisatı yaparken çalışamıyorum:
$ 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
Benzer bir soru okudum ( Birden fazla komutta saat nasıl çalıştırılır VE zaman çıktısını dosyaya yazılır? ) Ve ayrıca tek başına time
çalıştırılabilir dosyayı da denedim :
$ /usr/bin/time -p sh -c "foo.sh | bar.sh"
real 4.01
user 0.00
sys 0.00
Yalnızca boruyu çalıştıran üçüncü bir komut dosyası oluşturursam bile çalışmaz:
$ cat baz.sh
#!/bin/sh
foo.sh | bar.sh
Ve sonra o zaman:
$ time baz.sh
real 0m4.009s
user 0m0.003s
sys 0m0.000s
İlginç bir şekilde, time
ilk komut yapıldıktan hemen sonra çıkılmış gibi görünmüyor . Eğer değiştirirsem bar.sh
:
#!/bin/sh
sleep 2
seq 1 5
Ve sonra time
tekrar, time
çıktının basılmadan önce basılmasını bekliyordum , seq
ama değil:
$ time ( { foo.sh | bar.sh; } )
1
2
3
4
5
real 0m4.005s
user 0m0.003s
sys 0m0.000s
Raporunu yazdırmadan önce bitmesini beklemesine rağmen time
yürütme süresini saymıyor gibi görünüyor 1 .bar.sh
Tüm testler bir Arch sistemi üzerinde yapıldı ve bash 4.4.12 (1) - release kullanılarak yapıldı. Bash'ı sadece proje için kullanabiliyorum, bu onun bir parçası, bu yüzden zsh
ya da başka güçlü bir kabuğun etrafından dolansa bile, bu benim için uygun bir çözüm olmayacak.
Peki, bir takım bir takım komutların çalışması için geçen zamanı nasıl alabilirim? Ve biz onun yanındayken, neden çalışmıyor? time
İlk komut biter bitmez hemen çıkar gibi görünüyor . Niye ya?
Bireysel zamanları böyle bir şeyle alabileceğimi biliyorum:
( time foo.sh ) 2>foo.time | ( time bar.sh ) 2> bar.time
Ama yine de her şeyi tek bir işlem olarak zamanlamanın mümkün olup olmadığını bilmek istiyorum.
1 Bu bir tampon sorunu görünmüyor, ben komut dosyalarını çalıştırarak çalıştı unbuffered
ve stdbuf -i0 -o0 -e0
ve sayılar yine önce basıldığını time
çıktı.