Próbuję zmierzyć czas za pomocą:
/usr/bin/time myCommand
Ponieważ jednak /usr/bin/time
pisze do stderr, jeśli myCommand również pisze do stderr, otrzymam więcej niż tylko dane wyjściowe czasu w strumieniu. Chcę zrobić, przekierować wszystkie dane wyjściowe myCommand do /dev/null
, ale nadal zapisywać dane wyjściowe czasu do stderr. Korzystając z przykładu myCommand, który pisze do stderr ls /nofile
, widzimy, że (oczywiście) nie ma żadnych danych wyjściowych z następującymi:
$ /usr/bin/time ls /nofile 2> /dev/null
$
Bez żadnego przekierowania widzimy zarówno dane wyjściowe z ls
(do stderr), jak i dane wyjściowe z czasu (także do stderr):
$ /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
To, czego chcę, to coś, co po prostu produkuje:
$ /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
Jakieś pomysły?
io-redirection
time-utility
David Doria
źródło
źródło
Odpowiedzi:
W ksh, bash i zsh,
time
jest słowem kluczowym, a nie wbudowanym. Przekierowania w tym samym wierszu dotyczą tylko polecenia czasowego, a nie samego wyjściatime
.Aby przekierować dane wyjściowe z
time
siebie w tych powłokach, musisz użyć dodatkowego poziomu grupowania.Jeśli używasz wersji GNU autonomicznego
time
narzędzia, ma on-o
opcję zapisu danych wyjściowych wtime
innym miejscu niż stderr. Możesztime
napisać do terminala:Jeśli chcesz zachować wyjściowy
time
błąd przy standardowym błędzie, potrzebujesz dodatkowego poziomu tasowania deskryptorów plików.Za pomocą dowolnego
time
narzędzia można wywołać powłokę pośrednią, aby wykonać żądane przekierowania. Wywoływanie powłoki pośredniej w celu wykonania dodatkowych działań, takich jakcd
przekierowania itp., Jest dość powszechne - jest to rodzaj małych rzeczy, do których powłoki są przeznaczone.źródło
exec
zastępuje powłokę określonym programem zamiast uruchamiać ten program jako podproces. Niektóre powłoki wykonują tę optymalizację automatycznie, gdy polecenie jest ostatnim w skrypcie. „Pośrednia powłoka” oznacza po prostu: powłokę pomiędzytime
imycommand
; nie jest związany z podpowłokami./dev/tty
jest terminalem, na którym uruchomiona jest komenda (nie ma ona związku z/dev/ttyNUM
fizycznymi konsolami; mylisz się z deskryptorami plików: stdin jest/dev/fd/0
itp.).źródło
time
jest to alias bash?which time
wyświetla się/usr/bin/time
w CentOS 5.7.type time
pokaże ci:time is a shell keyword