Zaman birden çok komutta nasıl çalıştırılır ve zaman çıktısını dosyaya nasıl yazılır?


66

timeBirkaç komutun süresini ölçmek için komut çalıştırmak istiyorum .

Yapmak istediğim şey:

  • Birlikte eklenen hepsinin çalıştırılma süresini ölçün
  • Yazın timebir dosyaya çıktı
  • Ölçdüğüm STDERRkomuttan yazSTDERR

Ne yapmak DEĞİL yapmak istediğiniz

  • Birkaç komutu ayrı bir komut dosyasına yazın (neden? Çünkü bunların tümü zaten programlı olarak oluşturduğum bir komut dosyasıdır ve başka bir geçici komut dosyası oluşturmak istediğimden daha karışık olurdu)

Şimdiye kadar ne denedim:

/usr/bin/time --output=outtime -p echo "a"; echo "b";

Çalışmaz, timesadece ilki çalışır.

/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )

Çalışmaz (, beklenmedik belirtecidir.

/usr/bin/time --output=outtime -p { echo "a"; echo "b"; }

"Böyle bir dosya veya dizin yok" çalışmıyor.

/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'

"Böyle bir dosya veya dizin yok" çalışmıyor.

time ( echo "a"; echo "b"; ) 2>outtime

Tüm yönlendirmeleri beri Çalışmaz STDERRiçine outtime; timeOrada sadece çıktı istiyorum .

Ve tabi ki,

time --output=outime echo "a";

O zamandan beri işe yaramıyor --output=outime: command not found.

Nasıl yapabilirim?

Yanıtlar:


90

sh -c 'commands'Komut olarak kullanın , örneğin:

/usr/bin/time --output=outtime -p sh -c 'echo "a"; echo "b"'

2
daha kısa bir versiyon:time -p sh -c 'echo "a"; echo "b"'
Geo

8

Bunu dene:

% (time ( { echas z; echo 2 } 2>&3 ) ) 3>&2 2>timeoutput
zsh: command not found: echas
2
% cat timeoutput                                
( { echas z; echo 2; } 2>&3; )  0.00s user 0.00s system 0% cpu 0.004 total

Açıklama:

İlk önce, çıktısını yönlendirmek için bir yol bulmalıyız time. Bu yana timebir kabuk yerleşik olduğunu, bu komut yönlendirmeleri de dahil olmak üzere, ölçülecek şekilde tam komut satırı alır. Böylece,

% time whatever 2>timeoutput
whatever 2> timeoutput  0.00s user 0.00s system 0% cpu 0.018 total
% cat timeoutput 
zsh: command not found: whatever

[Not: janos'un yorumu bunun böyle olmadığı anlamına gelir bash.] Bir alt kabukta timeçalıştırıp timesonra da bu alt kabuğun çıkışını yönlendirerek çıktısının yeniden yönlendirilmesini sağlayabiliriz.

% (time whatever) 2> timeoutput
% cat timeoutput 
zsh: command not found: whatever
whatever  0.00s user 0.00s system 0% cpu 0.018 total

Şimdi çıkışını başarıyla yönlendirdik time, ancak çıktısı ölçtüğümüz komutun hata çıktısıyla karıştırılıyor. İkisini ayırmak için ek bir dosya tanıtıcısı kullanıyoruz.

"Dış" biz var

% (time ... ) 3>&2 2>timeout

Bunun anlamı: Dosya tanımlayıcı 3'e ne yazılırsa yazılsın, aynı yerde dosya tanımlayıcı 2 çıkar (standart hata) şimdi (terminal) çıkar. Ve sonra standart hatayı dosyaya yönlendiriyoruz timeout.

Şimdi elimizde: stdout'a ve fd 3'e yazılan her şey terminale gidecek ve stderr'e yazılan her şey dosyaya gidecektir. Geriye kalan, ölçülen komutun stderr'ini fd 3'e yönlendirmek.

% (time whatever 2>&3) 3>&2 2>timeout

Şimdi, zaman ölçümünü birden fazla komutla yapmak için, onları (diğer!) Alt kabuklarda (parantez içinde) çalıştırmamız gerekir. Ve hepsinin hata çıktısını fd 3'e yönlendirmek için onları küme parantezleri içinde gruplamamız gerekir.

Sonunda neye varıyoruz:

% (time ( { whatever; ls } 2>&3 ) ) 3>&2 2>timeoutput

Bu kadar.


Bu bir POSIX kabuğundaki bir sözdizimi hatasıdır. Muhtemelen bir faşizm?
josch

@josch burada kullanılan kabuk zsh.
angus

6

Doğru cevap değil, ancak soru ile çok ilgili.
Birden fazla program için zamanlama istatistiklerini alın Kombine parantez içinde gereklidir. Komutları noktalı virgüllerle ayırın.

time ( command1 ; command2 )

1
Bu güzel. Daha da iyisi, komutlar arasında && kullanın - öyle olsun, time ( command1 && command2 )böylece ilk komut başarısız olursa; diğerini çalıştırmaya devam etmeyecek.
bikashg
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.