Jak mogę przekierować dane wyjściowe polecenia „czas”?


95

Próbowałem przekierować dane wyjściowe polecenia czasu, ale nie mogłem:

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

W pliku widzę dane wyjściowe lspolecenia, a nie time. Proszę wyjaśnij, dlaczego nie mogłem i jak to zrobić.


1
Myślę, że powinno być na Superuser.
Mnementh

1
Odpowiedź na to pytanie interesuje nie tylko programistów, ale także innych zaawansowanych użytkowników: superuser.com
Mnementh

Odpowiedzi:


105

możesz przekierować wyjście czasu za pomocą,

(time ls) &> file

Ponieważ musisz potraktować (time ls) jako pojedyncze polecenie, aby móc używać nawiasów klamrowych.


1
tak, całkiem dobrze, ale pytanie brzmi, jak oni to zrobili?
abubacker

2
polecenie time przyjmie argumenty jako polecenie. Ale nawiasy zgrupują to jako jedno polecenie. Np .: czas ls> plik1.txt W argumentach, 0 = czas 1 = "ls> plik1.txt"
sganesh

8
Polecenie time wyświetla wynik na stderr. Możesz więc użyć (czas ls) 2> file
sganesh

5
Proszę wyjaśnić &>, gdzie mogę się o tym dowiedzieć?
hello_there_andy

3
@hello_there_andy &>filejest analogiczne do >file 2>&1. Kieruje zarówno stdout, jak i stderr.
ktbiz

132

nie ma potrzeby uruchamiania powłoki podrzędnej. Użyj bloku kodu.

{ time ls; } 2> out.txt

lub

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

1
Zgoda, najlepsza odpowiedź. Daje możliwość porzucenia wyników ls i uzyskania czasu. Dziękuję ghostdog74
rd42

1
Działało to w systemie AIX, gdy nic nie mogło przekierować danych wyjściowych komendy „hostent”. Dziękuję Ci!
Hugo

1
Wyjaśnienie 2>proszę. Gdzie mogę się o tym dowiedzieć?
hello_there_andy

3
jak mam to zrobić, jeśli chcę jednocześnie> i 2>?
Jorge Fernández-Hidalgo

25

Czas polecenia wysyła dane wyjściowe do STDERR (zamiast STDOUT). Dzieje się tak, ponieważ polecenie wykonywane normalnie z czasem (w tym przypadku ls) wysyła do STDOUT.

Jeśli chcesz uchwycić wynik czasu, wpisz:

(time ls) 2> filename

To przechwytuje tylko wynik czasu, ale wyjście ls przechodzi normalnie do konsoli. Jeśli chcesz przechwycić oba w jednym pliku, wpisz:

(time ls) &> filename

2> przekierowuje STDERR, &> przekierowuje oba.


1
Ta odpowiedź właściwie wyjaśnia, dlaczego przekierowanie PO nie działało, co było jednym z pytań zadawanych przez PO. Nikt inny się tym nie zajmuje.
NeutronStar

w jaki sposób jedna rura do drugiej mogłaby z tym przetwarzać?
Paweł

10

czas jest wbudowany w powłokę i nie jestem pewien, czy istnieje sposób na przekierowanie go. Możesz jednak użyć /usr/bin/timezamiast tego, który zdecydowanie akceptuje wszelkie przekierowania wyjściowe.


/ usr / bin / time --output nazwa_pliku ls
chub

4
Wbudowany czas działa dobrze z przekierowaniem wyjścia. Wyprowadza tylko na STDERR, a nie na STDOUT.
Mnementh

Problem polega na tym, że polecenia wbudowane są wykonywane w samym środowisku powłoki, a nie w podpowłoce. Ponieważ stderr twojej powłoki jest zwykle podłączony do terminala, przekierowanie nic nie da. Myślę, że aby przekierować wbudowany czas, musiałbyś zrobić coś takiego bash time mycmd 2>file. Lub po prostu zadzwoń, /usr/bin/timejak wspomniano.
ktbiz

Możesz także użyć
wersji niewbudowanej

4

Jeśli nie chcesz mieszać wyjścia z timei polecenia. Z czasem GNU możesz użyć -o file:

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

while timjest wyjściem czasu outi errsą stdout i stderr z grep.


4

Przyczyną, dla której przekierowanie wydaje się nie działać, timejest to, że jest to zarezerwowane słowo basha (nie wbudowane!), Gdy jest używane przed potokiem. bash (1):

Jeśli słowo zarezerwowane czas poprzedza potok, po zakończeniu potoku raportowany jest czas, który upłynął, a także czas użytkownika i systemu zużyty na jego wykonanie.

Tak więc, aby przekierować wyjście time, użyj nawiasów klamrowych:

{ time ls; } 2> filename

Lub zadzwoń /usr/bin/time:

/usr/bin/time ls 2> filename

0

Do testów używam przekierowania metody stdout i stderr z nawiasami klamrowymi. Oznacza to jednak krótszy. Nawiasy klamrowe wykonają polecenie (polecenia) w bieżącej powłoce. Zobacz: człowiek bash
&>>rpt>>rpt 2>&1

{ time ls a*; } &>>rpt
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.