Jak przekierować stderr i stdout do różnych plików w tym samym wierszu skryptu?

180

Tak dużo wiem:

$ command 2>> error

$ command 1>> output

Czy jest jakiś sposób, aby wyprowadzić stderr do pliku błędu i wyprowadzić stdout do pliku wyjściowego w tym samym wierszu bash?

użytkownik784637
źródło

Odpowiedzi:

292

Po prostu dodaj je w jednym wierszu command 2>> error 1>> output

Należy jednak pamiętać, że >>jest to dołączanie, jeśli plik już zawiera dane. Natomiast >zastąpi wszelkie istniejące dane w pliku.

Tak więc, command 2> error 1> outputjeśli nie chcesz dołączyć.

Ze względu na ukończenie możesz pisać 1>tak, jakby >wyjściowy był domyślny deskryptor pliku. tak 1>i >to samo.

Więc command 2> error 1> outputstaje sięcommand 2> error > output

Sujoy
źródło
3
Świetna odpowiedź! Naprawdę podoba mi się twoje wyjaśnienie, jak 1>można napisać jako>
user784637
Czym to się różni command &2>err.log, myślę, że całkowicie mylę sintaksje. (Link do właściwej odpowiedzi na wszystkie bash-rurki może być w porządku)
ThorSummoner
4
@ThorSummoner tldp.org/LDP/abs/html/io-redirection.html jest moim zdaniem tym, czego szukasz. Fwiw, wygląda na command &2>err.logto , że nie jest całkiem uzasadniony - znak & w tej składni jest używany jako deskryptor pliku jako cel, np. command 1>&2Przekieruje stdout na stderr.
DreadPirateShawn
@DreadPirateShawn, proszę nie łączyć ABS jako odnośnika - czasami zawiera jawne nieścisłości, a bardzo często zawiera przykłady złych praktyk. wiki.bash-hackers.org/howto/redirection_tutorial jest znacznie lepszym źródłem informacji o przekierowaniach.
Charles Duffy
27

Spróbuj tego:

your_command 2>stderr.log 1>stdout.log

Więcej informacji

Liczby 0przez 9deskryptorami plików w bash. 0oznacza standardowe wejście, 1oznacza standardowe wyjście, 2oznacza standardowy błąd. 3przelotowe 9są zapasowe do jakiegokolwiek innego tymczasowego użytkowania

Dowolny deskryptor pliku można przekierować do pliku lub do innego deskryptora pliku za pomocą operatora >. Zamiast tego możesz użyć operatora, >>aby dołączyć do pliku zamiast tworzyć pusty.

Stosowanie:

file_descriptor > filename

file_descriptor > &file_descriptor

Proszę odnieść się do zaawansowanego bash-Scripting Guide: Rozdział 20. I / O przekierowania .

Quintus.Zhou
źródło
Dzięki. Szukam tego przez godzinę
dılo sürücü
12

Tak:

$ command >>output 2>>error
Didier Trosset
źródło
9

Lub jeśli chcesz miksować wyjścia (stdout i stderr) w jednym pliku, możesz użyć:

command > merged-output.txt 2>&1
ztank1013
źródło
32
To nie jest odpowiedź na pytanie.
Matthias
Dlaczego ludzie łączą wyniki lub sugerują scalenie wyników?
nurettin
@nurettin: może masz wiersz skryptu, który po prostu wykonuje polecenie i natychmiast zapisuje dane wyjściowe w pliku dziennika. Dana komenda może czasami zawieść, dlatego też chcesz zapisać wszelkie błędy na ten temat, ale w tym samym pliku dziennika.
streamofstars
@ streamofstars tak, oczywiście, że masz rację, może czasem tego właśnie chcą ludzie. Komentowałem w kontekście tego pytania, jako ktoś, kto szukał odpowiedzi i znalazł wiele nieistotnych odpowiedzi w całym przepełnieniu stosu.
nurettin
0

Dane wyjściowe wielu poleceń mogą być przekierowywane. Działa to w wierszu poleceń lub najbardziej użytecznie w skrypcie bash. -sKieruje hasło szybkiej na ekranie.

Tutaj zablokuj cmds stdout / stderr są wysyłane do osobnych plików i nic do wyświetlenia.

sudo -s -u username <<'EOF' 2>err 1>out
ls; pwd;
EOF

Tutaj zablokuj cmds stdout / stderr są wysyłane do jednego pliku i wyświetlane.

sudo -s -u username <<'EOF' 2>&1 | tee out
ls; pwd;
EOF

Tutaj zablokuj cmds stdout / stderr są wysyłane do osobnych plików i stdout do wyświetlenia.

sudo -s -u username <<'EOF' 2>err | tee out
ls; pwd;
EOF

W zależności od tego, kim jesteś (whoami) i nazwy użytkownika, hasło może być wymagane lub nie.

rahogaboom
źródło