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.