Załóżmy, że mam plik binarny o nazwie foo
.
Jeśli chcę przekierować wyjście foo
do jakiegoś innego procesu bar
, mógłbym pisać ./foo | bar
.
Z drugiej strony, jeśli chciałem time
foo i przekierować wyjście z time
Mógłbym pisać time (./foo) | bar
.
Moje pytanie brzmi: w jaki sposób mogę przykleić wyjście time
do końca foo
i przepuścić przez tę samą rurę ?
Poniższe rozwiązanie nie jest tym, czego szukam, ponieważ uruchamia dwa oddzielne wystąpienia procesu bar
, podczas gdy chcę pojedynczego udostępnionego potoku, do pojedynczego wystąpienia bar
.
time (./foo | bar) | bar
Dla każdego, kto jest ciekawy, powodem, dla którego nie chce się uruchamiać dwóch instancji, bar
jest to, że bar
może to być klient sieciowy i chcę, aby informacje o taktowaniu były wysyłane do serwera jako część tego samego http POST
komunikatu co wynik procesu.
źródło
Odpowiedzi:
Jeśli zrozumiem, o co prosisz, zrobię to. Używam polecenia
ls ~
itee
jako stand-in dla./foo
ibar
, ale z ogólnej postaci, co chcesz, to:UWAGA: Wyjście z
time
jest już dołączane na końcu dowolnego wyjścia./foo
, po prostu robi się to na STDERR. Aby przekierować go przez potok, musisz połączyć STDERR ze STDOUT. Możesz użyć jednego|&
lub drugiego,2>&1
aby to zrobić.Przykład
A oto zawartość pliku
cmd.log
wyprodukowanego przeztee
.źródło
time
domyślnie wysyła dane wyjściowe do stderr zamiast stdout. Musisz tylko przekierować to tam, gdzie chcesz.Mówisz „Z drugiej strony, gdybym chciał
time
sfałszować i przekierować dane wyjściowetime
, mogłem pisaćtime (./foo) | bar
”. ale to w rzeczywistości jest nieprawidłowe. W takim przypadku wynik czasu będzie nadal wyświetlany na konsoli, przekierowywane będzie tylko standardowe wyjście.Możesz przekierować stderr w szczególności za pomocą:
lub wszystkie rury z:
Nawiasy są potrzebne do poprawnego działania.
źródło
Odkryłem, że działa to w systemie Solaris.
(time ls) &> file
źródło