Komutun çıkışını "time command" komutunda yeniden yönlendirin


11

Ben kullanarak bir şey zaman çalışıyorum:

/usr/bin/time myCommand

Bununla birlikte, stderr'a/usr/bin/time yazdığı için, myCommand da stderr'e yazıyorsa , akıştaki zamanın çıktısından daha fazlasını alacağım. Yapmak istediğim, tüm myCommand çıktılarını yönlendirmek /dev/null, ama yine de zaman çıktısını stderr'e yazmak. Stderr dosyasına yazan örnek bir myCommand kullanarak ls /nofile, (açık bir şekilde) aşağıdakilerle hiçbir çıktı olmadığını görüyoruz:

$ /usr/bin/time ls /nofile 2> /dev/null
$

Herhangi bir yönlendirme olmadan, hem ls(stderr'den) çıktıyı hem de zamandan (ayrıca stderr'a) çıktıyı görüyoruz :

$ /usr/bin/time ls /nofile
ls: cannot access /nofile: No such file or directory
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps

Ne istiyorum sadece üreten bir şeydir:

$ /usr/bin/time ls /nofile > RedirectThatImAskingFor
0.00user 0.00system 0:00.00elapsed 0%CPU (0avgtext+0avgdata 3776maxresident)k
0inputs+0outputs (0major+278minor)pagefaults 0swaps

Herhangi bir fikir?


Komut dosyasında time komutunu kullanıyorum. stderr yerine stdout zaman çıkışı istiyorum. bunu nasıl alabilirim?

Yanıtlar:


20

Ksh, bash ve zsh'de timebir anahtar sözcük, yerleşik bir anahtar sözcük değil. Aynı satırdaki yönlendirmeler yalnızca zamanlanan komut için geçerlidir, timekendisinin çıktısı için geçerli değildir.

$ time ls -d / /nofile >/dev/null 2>/dev/null

real    0m0.003s
user    0m0.000s
sys     0m0.000s

Çıkışı timebu kabuklarda kendinden yönlendirmek için ek bir gruplama düzeyi kullanmanız gerekir.

{ time mycommand 2>&3; } 3>&2 2>mycommand.time

Bağımsız timeyardımcı programın GNU sürümünü kullanırsanız, stderr -oyerine timebaşka bir yerde çıktı yazma seçeneği vardır . timeTerminale yazma yapabilirsiniz :

/usr/bin/time -o /dev/tty mycommand >/dev/null 2>/dev/null

Çıktıyı timestandart hatasında tutmak istiyorsanız , fazladan bir dosya tanıtıcısı karıştırması gerekir.

/usr/bin/time -o /dev/fd/3 mycommand 3>&2 >/dev/null 2>/dev/null

Herhangi bir timeyardımcı programla, istenen yönlendirmeleri gerçekleştirmek için bir ara kabuk çağırabilirsiniz. cdYönlendirmeler, vb. Gibi ek eylemler gerçekleştirmek için bir ara kabuğu çağırmak oldukça yaygındır - kabukların yapmak için tasarlandığı küçük şeyler.

/usr/bin/time sh -c 'exec mycommand >/dev/null 2>/dev/null'

Birkaç takip: 1) Son önerinizdeki 'exec' ne yapar? Onsuz çalışıyor gibi görünüyor: / usr / bin / time sh -c 'exec ls / nofile &> ./ output.dat' 2) "Ara kabuk" ile aynı "alt kabuk" parantez kullanmayı düşünüyor musunuz?). Ben boşuna / usr / bin / time (ls / nofile &> ./ output.dat) gibi şeyler deniyordu. 3) / dev / tty nedir? Tty0'ın stdin olduğunu biliyorum, tty1 = stdout, tty2 = stderr, ama sadece 'tty' ne olacak?
David Doria

4) / dev / fd3 seçeneği ile, -o çıktısını 3'e yazmayı, sonra 3 ila 2'yi, 1'i null'a ve 2'yi null'a yönlendirmeyi söylüyorsunuz. Yönlendirmeler soldan sağa doğru gerçekleştiği için 3'ü null değerine göndermemeli mi?
David Doria

1
@DavidDoria execbu programı bir alt işlem olarak çalıştırmak yerine kabuğu belirtilen programla değiştirir. Bazı kabuklar bir komut dosyasındaki son komut olduğunda bu optimizasyonu otomatik olarak gerçekleştirir. “Ara kabuk” sadece şu anlama gelir: timeve arasında olan bir kabuk mycommand; alt kabuklarla ilgisi yoktur. /dev/ttykomutun üzerinde çalıştığı terminaldir ( /dev/ttyNUMfiziksel konsollar ile ilgisi yoktur ; dosya tanımlayıcılarıyla karıştırıyorsunuz: stdin is /dev/fd/0vb.).
Gilles 'SO- kötü olmayı kes'

@DavidDoria Bir dosya tanımlayıcısının neye bağlandığını değiştirmek , soldan sağa gerçekleşir, bu da ters etki yapar. Bkz. Unix.stackexchange.com/questions/23964/… veya unix.stackexchange.com/questions/37660/order-of-redirections
Gilles 'SO- kötü olmayı kes'

0
[artur@asus-ux21e ~]$ find /etc/pki/CA/private/
/etc/pki/CA/private/
find: ‘/etc/pki/CA/private/’: Permission denied
[artur@asus-ux21e ~]$ time (find /etc/pki/CA/private/ &> /dev/null)

real    0m0.006s
user    0m0.001s
sys 0m0.004s

Bu aynı 'zaman' değil (inandığım bir bash takma adıdır). Mantıklı bir yönlendirme kurallarına uymadığını unutmayın? $ time &> / dev / null gerçek 0m0.000s kullanıcı 0m0.000s sys 0m0.000s
David Doria

1
Buna ne dersiniz: / usr / bin / time -o time / usr / bin / find / etc / pki / CA / private / &> / dev / null; kedi zamanı
Artur Szymczak

Evet bunu gördüm, ama -o gibi bir iç mekanizma kullanmadan nasıl yapacağımı merak ediyordum.
David Doria

@DavidDoria Size timebash takma adı olan izlenimi veren nedir ? CentOS 5.7'de which timegörüntülenir /usr/bin/time.
Timothy Martin

type timegösterecek:time is a shell keyword
Artur Szymczak
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.