Come reindirizzare stderr e stdout su file diversi e visualizzarli anche nel terminale?


30

Voglio vedere l'output di un comando nel terminale come se non ci fosse reindirizzamento. Inoltre, stderr deve essere reindirizzato a err.log e stdout deve essere reindirizzato a stdout.log.

Sarebbe bello avere anche la copia esatta di ciò che viene mostrato nel terminale, ovvero gli errori stampati come e quando si verificano, in un file separato: stdouterr.log.


@Nuno No non lo è. L'OP vuole avere file diversi per stdout e stderr.
dogbane,

@dogbane Sì, hai ragione. Mi dispiace per quello.
Nuno C. Inácio,

Trovo ancora questa domanda molto familiare. Fammi cercare ... Eccone uno molto simile unix.stackexchange.com/q/4195/250 , ed eccone uno correlato unix.stackexchange.com/q/1416/250
phunehehe

Risposte:


37

Utilizzare il teecomando come segue:

(cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log

3>&1 1>&2 2>&3 è come scambiare stderr e stdout, perché tee può accettare solo stdout.

Dai un'occhiata al comando tee Unix per reindirizzamenti più avanzati usando tee.


bella soluzione. C'è un modo per ottenere il codice di uscita cmd?
turbante,

2
@turbanoff Sostituisci cmdcon (cmd ; echo >exit_code.txt $?).
Parthian Shot,

Credo che ciò dovrebbe preservare meglio l'ordine delle cose in uscita dalla riga di comando:((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log)
TTT

5

Penso che registrare stdout e stderr su due file diversi sia una splendida idea. Non rende i registri asincroni? Quindi ho provato quanto segue:

  • stdout a "stdout.log" (come suggerito dogbane)
  • stderror in "stderr.log" (come suggerito dogbane)
  • tutto l'output su "all.log" e
  • essere ancora in grado di vedere l'uscita sul display (in un terminale separato però!)

((cmd | tee stdout.log) 3>&1 1>&2 2>&3 | tee stderr.log) &> all.log

in un altro terminale

tail -f --sleep-interval=2 all.log

Non è possibile dirigere stderr direttamente su una seconda tty? Quindi non è richiesto alcun file di registro.
Steven Lu,

@StevenLu sì, se conosci il nome e hai il permesso di scrivere sul secondo tty che puoi fare.
Jasen,

1
più facile sarebbe &| tee all.logalla fine del comando invece di&> all.log
Jasen il

@Jasen: seconda volta che vedo &|. Capisco &>, |&anche, ma cosa vuol &|dire in questo contesto? Non sono riuscito a trovare un riferimento di sintassi adatto, non in rete, nemmeno consultando la pagina del manuale di bash "bash (1)" ... Tx
Cbhihe

1
@Cbhihe per quanto ne so non fa nulla, intendevo dire|&
Jasen,

3

@dogbane, grazie.
Ho trovato anche un altro modo che salva entrambi i flussi approssimativamente nell'ordine in cui verrebbero stampati senza reindirizzamento.

command 2> >(tee errlog | tee -a bothLog > /dev/tty ) | tee outlog | tee -a bothLog

Questo funziona solo con le shell che supportano la sostituzione dei processi.


-2

prova questo :

command 2>&1 | tee bothLog

4
Ciao vasile, questo non risponde alla domanda: balki ha bisogno di file separati per stdout e stderr, la tua soluzione mescolerebbe entrambi nello stesso flusso.
Mat

Perché le persone uniscono stdout e stderr insieme? O dire ad altri di farlo?
Nurettin,
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.