visualizzare STDOUT prima di STDERR?


9

Sono nuovo a bash e non posso per la vita di me capire come eseguire un certo comando, supporre ./fffe stampare stdout regolari prima di stderr (sono confuso sul significato me stesso)

per esempio

$ printf "I am a\ndrill\n" > fff; 
$ cat fff nofile fff nofile fff

I am a
drill
cat: nofile: No such file or directory
I am a
drill
cat: nofile: No such file or directory
I am a
drill

deve stampare come:

I am a
drill
I am a
drill
I am a
drill
cat: nofile: No such file or directory
cat: nofile: No such file or directory

Comprendo che devo prima reindirizzare il mio output su un file e quindi aggiungere l'errore allo stesso file, tuttavia questo è l'output che ottengo

$ cat ./foo nofile ./foo nofile ./foo <<< $(touch fin) > see 2>> see 

I am a
drill
I am a
drill
I am a
drill
ectory
cat: nofile: No such file or directory

2
Ha catdavvero sostituire "un" con "un po '"?
Dmitry Grigoryev il

oh dang, avrei potuto incasinare la stringa. Lo modificherò subito @DmitryGrigoryev
MeOw

Risposte:


18

Dovrai comunque tenere l'output stderr da qualche parte per poterlo visualizzare alla fine.

Mi viene in mente un file :

fff 2> file; cat file >&2

O memoria (qui usando spongeda moreutils):

{ fff 2>&1 >&3 3>&- | sponge >&2 3>&-; } 3>&1
  • {...} 3>&1: entro {...}il descrittore di file (fd) 3 punta alla stessa risorsa dello stdout originale (quindi possiamo usarlo per ripristinare lo stdout per fff).
  • fff <redirs> | sponge <redirs>, fffE spongeha iniziato simultaneamente (con <redirs>applicata indipendentemente) con fff's stdout andando ad un tubo, e sponge' s stdin essendo l'altra estremità del tubo.
  • 2>&1: fd 2 di fff(stderr) punta alla stessa cosa di 1: la pipe a questo punto, quindi fffl'errore va spongeattraverso quella pipe.
  • >&3: ora stdout punta allo stdout originale (reindirizza a quello che era)
  • 3>&-: chiudiamo fd 2 che fffnon serve
  • spongeaccumula il suo input e lo visualizza solo (sul suo stdout che è stato reindirizzato con >&2la stessa risorsa di stderr) dopo che ha rilevato eof sul suo stdin (si presume che sia quando ffftermina e ha già scritto tutto il suo output sul suo stdout).

Se spongenon è installato, è possibile sostituirlo con perl -0777 -pe ''. Con -pe '', perllegge un record alla volta dal suo input e lo scrive su stdout. -0777è la modalità slurp in cui il record (solo uno in quel caso) è l'intero input.


Si prega gentilmente di abbatterlo se avete tempo!
George Udosen,

Possiamo usare teeinvece di sponge...?
George Vasiliou,

@GeorgeUdosen vedi modifica.
Stéphane Chazelas,

1
@GeorgeVasiliou, teenon contiene dati, li scrive non appena li legge.
Stéphane Chazelas,

2
@MeOw: Va bene, ma, come mostra la terza riga della risposta di Stéphane, non è necessario salvare lo stdout; fallo e basta cat foo nofile foo nofile foo 2> ferr.txt; cat ferr.txt. (E probabilmente don t vuole usare >>.) Inoltre, Stéphane fa il punto eccellente che probabilmente si dovrebbe fare cat ferr.txt >&2per scrivere le informazioni stderr per stderr.
G-Man dice "Ripristina Monica" il
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.