Come reindirizzare stderr e stdout a file diversi nella stessa riga nello script?


180

Lo so molto:

$ command 2>> error

$ command 1>> output

C'è un modo in cui posso generare lo stderr nel file di errore e lo stdout nel file di output nella stessa riga di bash?

Risposte:


292

Aggiungili in una riga command 2>> error 1>> output

Tuttavia, si noti che >>è da aggiungere se il file contiene già dei dati. Considerando che, >sovrascriverà tutti i dati esistenti nel file.

Quindi, command 2> error 1> outputse non si desidera aggiungere.

Solo per completezza, puoi scrivere 1>come appena >l'output è il descrittore di file predefinito. così 1>ed >è la stessa cosa.

Quindi command 2> error 1> outputdiventacommand 2> error > output


3
Bella risposta! Mi piace molto la tua spiegazione di come 1>può essere scritto come>
user784637

In che modo è diverso dal simile command &2>err.log, penso di essere totalmente confuso dalle sintassi. (Potrebbe essere in ordine un collegamento a una risposta appropriata di tutti i problemi della pipa bash)
ThorSummoner,

4
@ThorSummoner tldp.org/LDP/abs/html/io-redirection.html è ciò che penso tu stia cercando. A prima vista, sembra che command &2>err.lognon sia del tutto legittimo: la e commerciale in quella sintassi viene utilizzata come descrittore di file come destinazione, ad esempio command 1>&2reindirizzare stdout a stderr.
DreadPirateShawn

@DreadPirateShawn, ti preghiamo di non collegare l'ABS come riferimento: a volte contiene inesattezze definitive e molto spesso contiene esempi di cattive pratiche. wiki.bash-hackers.org/howto/redirection_tutorial è una fonte di riferimento molto migliore sul reindirizzamento.
Charles Duffy,

27

Prova questo:

your_command 2>stderr.log 1>stdout.log

Maggiori informazioni

I numeri 0attraverso 9sono descrittori di file in bash. 0sta per input standard, 1sta per output standard, 2sta per errore standard. 3attraverso 9sono di riserva per qualsiasi altro uso temporaneo.

Qualsiasi descrittore di file può essere reindirizzato a un file o a un altro descrittore di file utilizzando l'operatore >. È possibile invece utilizzare l'operatore >>per aggiungere un file anziché crearne uno vuoto.

Uso:

file_descriptor > filename

file_descriptor > &file_descriptor

Si prega di fare riferimento alla avanzata di scripting Bash: Capitolo 20. Redirezione I / O .


Grazie. Ho cercato questo per un'ora
dılo sürücü


9

Oppure, se ti piace mescolare output (stdout e stderr) in un singolo file, potresti voler usare:

command > merged-output.txt 2>&1

32
Questa non è una risposta alla domanda.
Matthias,

Perché le persone uniscono i risultati o suggeriscono di unire i risultati?
Nurettin,

@nurettin: forse hai una riga di script che esegue solo un comando e salva istantaneamente l'output in un file di registro. Il comando in questione potrebbe non riuscire a volte, quindi si desidera salvare anche eventuali errori al riguardo, ma nello stesso file di registro.
streamofstars,

@streamofstars sì, certo, hai ragione, forse a volte è quello che la gente vuole, stavo commentando nel contesto di questa domanda come qualcuno che cercava risposte e ne ho trovate molte irrilevanti in tutto lo stackoverflow.
Nurettin,

0

L'output di più comandi può essere reindirizzato. Funziona per la riga di comando o utilmente in uno script bash. Il -sreindirizza la richiesta della password allo schermo.

Hereblock cmds stdout / stderr vengono inviati a file separati e nulla da visualizzare.

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

Hereblock cmds stdout / stderr vengono inviati a un singolo file e visualizzati.

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

Quiblock cmds stdout / stderr vengono inviati a file separati e stdout da visualizzare.

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

A seconda di chi sei (whoami) e nome utente, potrebbe essere necessaria o meno una password.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.