Wiem, jak przekierować do pliku i użyć tee; na poziomie podstawowym. Więc
$ alias outanderr='bash -c "echo stdout >&1; echo stderr >&2"'
# A fake "application" displaying both output and error messages.
$ outanderr 1>file # redirect stdout to a file, display stderr
stderr
$ outanderr 2>file # redirect stderr to a file, display stdout
stdout
$ outanderr 1>file 2>&1 # redirect both to a file, display nothing
$ outanderr | tee file; echo "-- file contents --" && cat file
# redirect stdout to a file, display both (note: order is messed up)
stderr
stdout
-- file contents --
stdout
$ outanderr 2>&1 | tee file; echo "-- file contents --" && cat file
# redirect both to a file, display both
stdout
stderr
-- file contents --
stdout
stderr
Pytanie brzmi: co napisać zamiast znaków zapytania, aby uzyskać wynik poniżej:
$ outanderr ???; echo "-- file contents --" && cat file
# redirect both to a file, display stderr
stderr
-- file contents --
stdout
stderr
Konstantty:
- Zakładając uderzenie.
- Kolejność powinna być przechowywana w pliku.
- zawartość stderr jest wyświetlana w czasie rzeczywistym linia po linii, tzn. bez buforowania.
- Można użyć osobnych plików skryptów.
- Magia może być konieczna.
bash
files
io-redirection
TWiStErRob
źródło
źródło
outanderr
masz kontroli nad programem?outanderr
jest tylko alias, który wypisuje linię na stdout, a drugi na stderr. Ideą (jeśli to możliwe) jest zbudowanie ogólnego rozwiązania, które mogłoby współpracować z dowolnym programem, bez ich modyfikacji.Odpowiedzi:
Dla łatwego testowania:
Edycja 1:
Działa to poprzez zapisanie stdout (tylko) do pliku, utworzenie sterr stdout tak, aby przechodziło przez potok i zapisanie przez tee swoich wyników w tym samym pliku.
Oba zapisy muszą być wykonane w trybie dołączania (
>>
zamiast>
), w przeciwnym razie oba zastąpiłyby dane wyjściowe pozostałych.Ponieważ potok jest buforem, nie ma gwarancji, że dane wyjściowe pojawią się w pliku we właściwej kolejności. Nie zmieniłoby się to nawet, gdyby aplikacja była podłączona do obu deskryptorów plików (dwóch potoków). Aby zagwarantować porządek, oba wyjścia musiałyby przejść przez ten sam kanał i odpowiednio oznaczone. Lub potrzebujesz naprawdę wymyślnych rzeczy:
/dev/null
. Dane wyjściowe aplikacji zostaną rozdzielone przez uruchomieniestrace -f -s 32000 -e trace=write
. W takim przypadku musiałbyś odwrócić ucieczkę. Nie trzeba dodawać, że śledzenie aplikacji nie działa szybciej.źródło
stdout
istderr
dotee
, albo ja czegoś brakuje? Myślę, że wymóg PO jesttee
stderr
tylko taki.