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ć.

abubacker
źródło
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
1
Możliwy duplikat Czy istnieje sposób na przekierowanie wyjścia czasu do pliku w systemie Linux
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

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.

sganesh
źródło
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
ghostdog74
źródło
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.

Mnementh
źródło
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.

Michal Čihař
źródło
/ 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.

Ding-Yi Chen
źródło
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
user1338062
źródło
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
poznawczy lub c
źródło