Przekierowanie standardowego wyjścia z dwóch programów

9

Korzystam z narzędzia do sprawdzania pamięci (prog1) na kodzie C ++ (prog2), które dają ogromne i szczegółowe wyniki. Aby wyśledzić kilka błędów, muszę zapisać to wyjście w pliku.

Próbowałem przekierować standardowe wyjście do pliku:

prog1 prog2 > outfile.txt

Ale to daje mi plik zawierający dane wyjściowe prog2, podczas gdy dane wyjściowe prog1 wciąż idą do terminala.

Czy ktoś zna sposób, aby określić, że ZARÓWNO wyjścia mają iść do pliku? Jak (prog1 prog2) > outfile.txt?

FJC
źródło

Odpowiedzi:

19

Istnieje duża szansa, że prog1zapisuje dane wyjściowe na standardowy błąd. Możesz przekierować oba wyjścia do jednego pliku za pomocą

prog1 prog2 > outfile.txt 2>&1

lub możesz podzielić wyniki za pomocą

prog1 prog2 > outfile.txt 2> errors.txt

To nie oddziela wyników poszczególnych programów , oddziela kanały wyjściowe. Zobacz Jakie są operatory kontroli i przekierowania powłoki? dla szczegółów.

Jeśli spojrzysz na prog1dokumentację, możesz znaleźć opcję, aby zamiast tego zapisać wyniki w nazwanym pliku. Na przykład, z strace,

strace -o strace.txt prog2 > outfile.txt

przechowuje stracedane wyjściowe w strace.txt, a wszystko zapisane na standardowe wyjście w outfile.txt.

Stephen Kitt
źródło
5
2>&1musi przejść po > outfile.txt . Kolejność przekierowań ma znaczenie.
Barmar
Uwaga dla przyszłych czytelników: @Barmar ma absolutną rację, że względna kolejność przekierowań ma względem siebie znaczenie. Dla osób mniej znanych kolejność przekierowań w odniesieniu do argumentów programu ma znaczenie tylko w kilku przypadkach. Początek i koniec to wspólne lokalizacje, ale czasami zdarza się również środek (proszę nie rób tego). echo >&2 hello worldjest równoważne z echo hello world >&2. Więcej informacji tutaj: tldp.org/LDP/abs/html/io-redirection.html
Morgen