Chcę uruchomić time
polecenie, aby zmierzyć czas kilku poleceń.
Chcę zrobić:
- Zmierz czas działania wszystkich dodanych razem
- Zapisz dane
time
wyjściowe do pliku - Napisz
STDERR
polecenie, do którego zmierzamSTDERR
To, czego NIE chcę robić, to
- Zapisz kilka poleceń w osobnym skrypcie (dlaczego? Ponieważ to wszystko jest już skryptem, który generuję programowo, a tworzenie INNEGO skryptu tymczasowego byłby bardziej bałagan niż chcę)
Co próbowałem do tej pory:
/usr/bin/time --output=outtime -p echo "a"; echo "b";
Nie działa, time
działa tylko na pierwszym.
/usr/bin/time --output=outtime -p ( echo "a"; echo "b"; )
Nie działa, (
jest nieoczekiwany token.
/usr/bin/time --output=outtime -p { echo "a"; echo "b"; }
Nie działa, „nie ma takiego pliku ani katalogu”.
/usr/bin/time --output=outtime -p ' echo "a"; echo "b";'
Nie działa, „nie ma takiego pliku ani katalogu”.
time ( echo "a"; echo "b"; ) 2>outtime
Nie działa, ponieważ przekierowuje wszystko STDERR
na outtime
; Chcę tylko dane time
wyjściowe.
I oczywiście,
time --output=outime echo "a";
Odtąd nie działa --output=outime: command not found
.
Jak mogę to zrobić?
źródło
time -p sh -c 'echo "a"; echo "b"'
Spróbuj tego:
Wyjaśnienie:
Najpierw musimy znaleźć sposób na przekierowanie wyjścia
time
. Ponieważtime
jest to wbudowana powłoka, do pomiaru mierzy się pełny wiersz poleceń, w tym przekierowania. A zatem,[Uwaga: komentarz janos sugeruje, że tak nie jest
bash
.] Przekierowanietime
wyjścia można osiągnąć, uruchamiająctime
podpowłokę, a następnie przekierowując wyjście tej podpowłoki.Teraz pomyślnie przekierowaliśmy dane wyjściowe
time
, ale jego dane wyjściowe są pomieszane z danymi wyjściowymi błędów komendy, którą mierzymy. Aby je rozdzielić, używamy dodatkowego deskryptora pliku.Na „zewnątrz” mamy
Oznacza to: cokolwiek jest zapisane w deskryptorze pliku 3, zostanie wyprowadzone w to samo miejsce, w którym deskryptor pliku 2 (błąd standardowy) jest teraz wyprowadzany (terminal). A następnie przekierowujemy standardowy błąd do pliku
timeout
.Teraz mamy: wszystko zapisane na stdout i fd 3 przejdzie do terminala, a wszystko zapisane na stderr przejdzie do pliku. Pozostało nam przekierowanie stderr mierzonego polecenia na fd 3.
Teraz, aby zmierzyć czas więcej niż jedną komendę, musimy uruchomić je w (innej!) Podpowłoce (w nawiasach). Aby przekierować wyjście błędów wszystkich na fd 3, musimy zgrupować je w nawiasach klamrowych.
Wreszcie dochodzimy do:
Otóż to.
źródło
Nieprawidłowa odpowiedź, ale bardzo związana z pytaniem.
Wymagane są statystyki czasowe dla wielu programów połączone nawiasy. Oddziel polecenia średnikami.
źródło
time ( command1 && command2 )
, aby w przypadku niepowodzenia pierwszego polecenia; nie przystąpi do wykonania drugiego.