"Zaman" komutunun çıktısını nasıl yeniden yönlendirebilirim?


95

Zaman komutunun çıktısını yeniden yönlendirmeyi denedim, ancak yapamadım:

$time ls > filename
real    0m0.000s
user    0m0.000s
sys     0m0.000s

Dosyada lskomutun çıktısını göremiyorum time. Lütfen neden yapamadığımı ve bunu nasıl yapacağımı açıklayın.


1
Superuser'da olmalı, bence.
Mnementh

1
Bu sorunun cevabı sadece programcılar için değil, aynı zamanda diğer
uzman

Yanıtlar:


105

zaman çıktısını kullanarak yeniden yönlendirebilirsiniz,

(time ls) &> file

Çünkü (time ls) 'yi tek bir komut olarak almanız gerekir, böylece parantez kullanabilirsiniz.


1
evet rahatlıkla iyi, ama soru bunu nasıl yaptıkları?
abubacker

2
time command argümanları komut olarak alacaktır. Ancak parantez bunu tek bir komut olarak gruplayacaktır. Ör: zaman ls> dosya1.txt Bağımsız değişkenlerde, 0 = zaman 1 = "ls> dosya1.txt"
sganesh

8
Ve zaman komutu çıktıyı stderr olarak yazdırır. Böylece (time ls) 2> file
sganesh'i kullanabilirsiniz.

5
&>Lütfen açıklama , bunları nereden öğrenebilirim?
hello_there_andy

3
@hello_there_andy &>fileile benzerdir >file 2>&1. Hem stdout hem de stderr'i yönetir.
ktbiz

132

alt kabuğu başlatmaya gerek yok. Bir kod bloğu kullanmak da işe yarar.

{ time ls; } 2> out.txt

veya

{ time ls > /dev/null 2>&1 ; } 2> out.txt

1
Kabul edildi, En iyi cevap. Size sonuçları bir kenara atıp zamanı alma seçeneği sunar. Teşekkür ederim ghostdog74
rd42

1
Bu, hiçbir şey "hostent" komutunun çıktısını yeniden yönlendiremediğinde AIX ile çalıştı. Teşekkür ederim!
Hugo

1
2>Lütfen açıklama . Bunları nereden öğrenebilirim?
hello_there_andy

3
aynı anda hem> hem de 2> istiyorsam bunu nasıl yaparım?
Jorge Fernández-Hidalgo

25

Komut zamanı çıktısını STDERR'ye gönderir (STDOUT yerine). Bunun nedeni, zamanla normal olarak çalıştırılan komutun (bu durumda ls) STDOUT'a çıktı vermesidir.

Zamanın çıktısını yakalamak istiyorsanız şunu yazın:

(time ls) 2> filename

Bu sadece zamanın çıktısını yakalar, ancak ls çıktısı konsola normal gider. İkisini de tek bir dosyada yakalamak istiyorsanız şunu yazın:

(time ls) &> filename

2> STDERR'yi yeniden yönlendirir &> her ikisini de yeniden yönlendirir.


1
Bu cevap aslında OP'nin yeniden yönlendirmesinin neden çalışmadığını yanıtlıyor, ki bu da OP'nin sorduğu sorulardan biriydi. Başka kimse buna değinmiyor.
NeutronStar

bununla bir başka sürece nasıl gidilebilir?
Paul

10

zaman kabuk yerleşiktir ve onu yeniden yönlendirmenin bir yolu olup olmadığından emin değilim. Ancak /usr/bin/timebunun yerine herhangi bir çıktı yönlendirmesini kesinlikle kabul eden kullanabilirsiniz .


/ usr / bin / time --output dosya adı ls
chub

4
Yerleşik zaman, çıktı yeniden yönlendirme ile iyi çalışır. STDOUT üzerinde değil, sadece STDERR üzerinde çıktı verir.
Mnementh

Sorun, yerleşik komutların bir alt kabukta değil, kabuk ortamında yürütülmesidir. Kabuğunuzun stderr'i tipik olarak terminale bağlı olduğundan, yeniden yönlendirme hiçbir şey yapmaz. Yerleşik zamanı yeniden yönlendirmek için, buna benzer bir şey yapmanız gerektiğine inanıyorum bash time mycmd 2>file. Ya da sadece /usr/bin/timebelirtildiği gibi arayın .
ktbiz


5

Yeniden yönlendirmenin işe yaramamasının nedeni time, bir boru hattının önünde kullanıldığında bash için ayrılmış bir kelime (yerleşik değil!) Olmasıdır. bash (1):

Zaman ayrılan sözcük bir ardışık düzenten önce gelirse, yürütme tarafından tüketilen kullanıcı ve sistem süresinin yanı sıra geçen ve ardışık düzen sona erdiğinde rapor edilir.

Bu nedenle, çıkışını yeniden yönlendirmek timeiçin küme parantezleri kullanın:

{ time ls; } 2> filename

Veya arayın /usr/bin/time:

/usr/bin/time ls 2> filename

4

Çıktıyı timeve komutu karıştırmak istemiyorsanız . GNU zamanı ile şu şekilde kullanabilirsiniz -o file:

/usr/bin/time -o tim grep -e k /tmp 1>out 2>err

while tim, zamanın çıktısıdır outve errstdout ve stderr'dir grep.


0

Test için stdout ve stderr yönteminin yeniden yönlendirmesini parantezlerle kullanıyorum.
Bunu &>>rpttemsil ediyor >>rpt 2>&1ama daha kısa.
Küme ayraçları, mevcut kabukta bir komut çalıştırır. Bakınız: man bash

{ time ls a*; } &>>rpt
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.