$ # captures output of command and time
$ time=$( TIMEFORMAT="%R";{ time ls;}2>&1)# note the curly braces
$ # captures the time only, passes stdout through
$ exec 3>&14>&2
$ time=$(TIMEFORMAT="%R";{ time ls 1>&32>&4;}2>&1)
bar baz
$ exec 3>&-4>&-
Czas będzie wyglądał jak „0,000”, przy użyciu TIMEFORMAT="%R"którego będzie to „czas rzeczywisty”.
czy mógłbyś trochę wyjaśnić, jak to działa? Od lat używam takiego fragmentu, jak ten kultowy kult ładunku. Jaki jest strumień 3 i 4? i „-”?
Sirex
1
@Sirex: Strumienie 3 i 4 to strumienie utworzone przez execpolecenie w mojej odpowiedzi przy użyciu dostępnych deskryptorów plików. Można użyć dowolnych dostępnych deskryptorów plików. Strumienie 3 i 4 są odpowiednio kopiami 1 ( stdout) i 2 ( stderr). Pozwala to lsna normalne przejście wyjścia do stdouti stderrprzez 3 i 4, podczas gdy wyjście time(które zwykle przechodzi stderr) jest przekierowywane do oryginału stdout(1), a następnie przechwytywane w zmiennej za pomocą podstawiania poleceń. Jak widać w moim przykładzie, nazwy plików bari bazsą wyprowadzane do terminala. ...
Wstrzymano do odwołania.
1
... Po zakończeniu dodatkowe strumienie są zamykane za pomocą trailing -.
Wstrzymano do odwołania.
4
Czas zapisuje dane wyjściowe do STDERR zamiast STDOUT. Co gorsza, domyślnie „czas” jest wbudowanym poleceniem powłoki, więc jeśli spróbujesz „czas ls 2> i 1”, „2> i 1” dotyczy tylko „ls”.
Jestem zainteresowany zrobieniem tego bez -o. Czy możesz napisać jedną z wymyślnych metod, o których myślałeś :)?
David Doria
0
Odpowiedź Dennisa Williamsona jest świetna, ale nie pomaga przechowywać danych wyjściowych polecenia w jednej zmiennej, a danych wyjściowych timew innej zmiennej. W rzeczywistości nie jest to możliwe przy użyciu deskryptorów plików.
Jeśli chcesz zapisać czas działania programu, możesz to zrobić, odejmując czas rozpoczęcia od czasu zakończenia. Oto prosty przykład, który pokazuje, ile milisekund potrzebował do uruchomienia programu:
time
; Odpowiedź Dennisa Williamsona jest lepsza pod tym względem.Zobacz BashFAQ / 032 .
Czas będzie wyglądał jak „0,000”, przy użyciu
TIMEFORMAT="%R"
którego będzie to „czas rzeczywisty”.źródło
exec
polecenie w mojej odpowiedzi przy użyciu dostępnych deskryptorów plików. Można użyć dowolnych dostępnych deskryptorów plików. Strumienie 3 i 4 są odpowiednio kopiami 1 (stdout
) i 2 (stderr
). Pozwala tols
na normalne przejście wyjścia dostdout
istderr
przez 3 i 4, podczas gdy wyjścietime
(które zwykle przechodzistderr
) jest przekierowywane do oryginałustdout
(1), a następnie przechwytywane w zmiennej za pomocą podstawiania poleceń. Jak widać w moim przykładzie, nazwy plikówbar
ibaz
są wyprowadzane do terminala. ...-
.Czas zapisuje dane wyjściowe do STDERR zamiast STDOUT. Co gorsza, domyślnie „czas” jest wbudowanym poleceniem powłoki, więc jeśli spróbujesz „czas ls 2> i 1”, „2> i 1” dotyczy tylko „ls”.
Rozwiązaniem byłoby prawdopodobnie coś w rodzaju:
Jest więcej wymyślnych sposobów na zrobienie tego, ale jest to jasny / prosty sposób.
źródło
Odpowiedź Dennisa Williamsona jest świetna, ale nie pomaga przechowywać danych wyjściowych polecenia w jednej zmiennej, a danych wyjściowych
time
w innej zmiennej. W rzeczywistości nie jest to możliwe przy użyciu deskryptorów plików.Jeśli chcesz zapisać czas działania programu, możesz to zrobić, odejmując czas rozpoczęcia od czasu zakończenia. Oto prosty przykład, który pokazuje, ile milisekund potrzebował do uruchomienia programu:
Nie jest to tak dokładne jak
time
polecenie, ale powinno działać idealnie w przypadku większości skryptów bash.Niestety
date
polecenie Maca nie obsługuje tego%N
formatu, ale możesz zainstalowaćcoreutils
(brew install coreutils
) i użyćgdate
:źródło