Linux meno comportamento e stderr


11

Sto guardando l'output del mio complicato comando less, il problema è che stderrsi perde. stderrle righe vengono normalmente elencate tra le stdoutrighe all'interno less. Vorrei che fossero stampati sulla console, e quando esco less, li vedo lì insieme.

Mi rendo conto che potrebbe non esserci soluzione a questo, ho letto teee, multiteema finora non ho avuto fortuna.


2
Mi stai dicendo come reindirizzare stderr a stdout ma non è quello che volevo. Non voglio che stderr si mescoli con stdout all'interno di meno. Vorrei che Stderr fosse nel terminal quando esco di meno.

Se stderrviene reindirizzato a stdout, tutto l'output stderr verrà miscelato con l'output normale attivo stdout. Il piping dell'output a lessmostrerà entrambi.
Qualche programmatore, amico, il

Se ignoro "stderr per essere nel terminale quando esco di meno", suggerisco di premere Ctrl-L lessper ridipingere lo schermo.
kamae,

Risposte:


10

Può essere

command 2> command.err | less; cat command.err; rm command.err

appendice

Qui di seguito un chiarimento per le persone che trascurano di leggere attentamente la domanda e che non hanno letto il commento chiarificatore del PO sopra.

haelix ha sottolineato:

le linee stderr normalmente vengono elencate tra le linee stdout all'interno di meno

e, in un commento per i primi soccorritori, scrisse:

Mi stai dicendo come reindirizzare stderr a stdout ma non è quello che volevo. Non voglio che stderr si mescoli con stdout all'interno di meno. Vorrei che Stderr fosse nel terminal quando esco di meno

Il problema è probabilmente specifico della piattaforma, è sicuramente qualcosa che ho sperimentato su vecchie piattaforme Unix SVR4.

Se, su tali piattaforme, fai qualcosa del genere

 find / ... | less

qualsiasi messaggio di errore (ad es. permessi di directory) appare così in meno

 stdout line 1
 stdout line 2
 error message text
 stdout line 4

in modo che le linee di uscita siano oscurate da messaggi di errore.

Se si aggiorna la pagina, le righe di output vengono visualizzate correttamente ma si perdono i messaggi di errore. Quando si esce di meno, lo schermo viene cancellato ad eccezione di un prompt dei comandi.

Se fai qualcosa del genere

  find / ... 2>&1 | less

I messaggi di errore sono mescolati con l'output standard. Ancora una volta quando si esce di meno, lo schermo è vuoto.

Se si desidera prima esaminare solo l'output standard in meno, quindi vedere i messaggi di errore dopo essere usciti in meno, è necessaria una soluzione diversa.

Questo è ciò che stavo suggerendo provvisoriamente nella mia risposta originale a due righe.


Questa è spazzatura. La risposta di Joachim dovrebbe essere quella accettata.
Vanilla Face,

2
@VanillaFace: ho aggiunto del materiale di chiarimento alla mia risposta.
RedGrittyBrick,

15

Devi reindirizzare stderra stdout:

$ ./somecommad 2>&1 | less

Controlla il manuale della tua shell (ad es man bash.)


1
Commenta per i nuovi lettori di questa vecchia domanda (non particolarmente per Joachim) Questo è ciò che tutti pensano alla prima scansione della domanda. Ma il problema è più sottile - vedi la discussione nei commenti dopo la risposta di
dmckee

1

dì alla shell di reindirizzare fd 2 a fd 1 (da stderr a stdout)

 make 2>&1 | less

1

Una cosa che mancava da tutte le risposte finora è la ragione, perché questo sta accadendo. Il problema qui è una sorta di condizione di competizione tra il processo di uscita roba stderre la lessvisualizzazione dell'output stdoutsul terminale. Se lessinizia la visualizzazione dopo che tutto l'output su stderrè stato stampato sul terminale, lesslo conserverà e potrai vedere i messaggi dopo essere usciti less. OTOH se lessha già iniziato a mostrare cose, allora i messaggi di errore si mescolano lessall'output e nulla viene preservato dopo le lessuscite (perché lessconserva il terminale com'era prima di avviarlo e non sa nulla dei messaggi di errore che si sono verificati).

Puoi vederlo facilmente, se lo fai ad es

grep foo -r /etc | less

Tutti i messaggi di errore "Autorizzazione negata" si confondono con l' lessoutput e non ci sarà più nulla dopo l'uscita. Se fate

grep foo -r /etc | (sleep 10; less)

tutti (o almeno la maggior parte) dei messaggi di errore sono stati stampati sul terminale prima che lesssia possibile visualizzare l'output e successivamente verranno visualizzati i messaggi di errore.

Ovviamente, di solito non vuoi aspettare 10 secondi prima di iniziare less, ma con Linux puoi anche fornire valori frazionari per il tempo di attesa, e con processi a esecuzione veloce spesso qualcosa di quanto sleep 0.1basta per evitare le condizioni di gara. (Ma, naturalmente, se vuoi o devi essere davvero sicuro usa la soluzione di RedGrittyBrick).


0

È necessario comprendere il concetto di "descrittori di file". Di solito, un'applicazione unix inizierà con tre descrittori di file speciali:

  • Input standard
  • Uscita standard
  • Errore standard

Il "pipe" |nella shell si collega stdoutda un processo con stdinquello successivo.

Gli errori - per progettazione - non sono alimentati stdindal processo successivo. Spesso non avranno senso per l'applicazione successiva e non dovrebbero essere nascosti all'utente.

Se vuoi mescolare gli errori in stdout, puoi usare ad esempio 2>&1, che dice essenzialmente "aggiungi stderr a stdout". Per esempio

find /etc 2>&1 | less

dovrebbe includere anche l'output di errore da file inaccessibili.

find /etc 2>&1 >/dev/null | less

ti darà solo gli errori.


0

Sono confuso sulla tua domanda, per quanto posso dire che il tuo comportamento desiderato è l'impostazione predefinita.

Quando uso

#include <stdio.h>

int main(int argc, char**argv){
  for (int j=0; j<10; ++j){
    fprintf( (j%2 ? stdout : stderr) , "%d\n" , j);
  }
  return 0;
}

per fare un semplice test,

$ ./testredirection | less

fa proprio quello che chiedi. Questo è quello che vedo

1
3
5
7
9
(END) 

in lesse

$ ./testredirection | less
0
2
4
6
8
$ 

quando ho smesso less


È strano ma le cose non sono sempre così. Prova con uno script ( echo info ; echo error 1>&2) e ripeti il ​​test: entrambe le righe vengono reindirizzate a meno.
cYrus il

@cYrus: funziona anche come previsto per me. 'Naturalmente ho provato su una scatola di Mac OS. Bash 3.2.17, meno 394. Forse qualcosa di specifico per Linux. In ogni caso l'approccio di RedGrittyBrick dovrebbe funzionare bene.
dmckee --- ex-moderatore gattino

Strano! Debian Squeeze / Bash 4.1.5 / Less 436
cYrus

Sì, ho aperto una shell di Scientific Linux 5.3 al lavoro e ho ottenuto il comportamento previsto con bash 3.0.15 e meno 382. Potrebbe esserci una regressione?
dmckee --- ex-moderatore gattino

Non lo so, penso sia solo una questione di buffering.
cYrus il

0

Mi capita di incontrare questo problema in uno dei miei Debian 5.0 di recente. per esempio, ls abc | meno trovo che il messaggio di errore vada in meno, il che a mia insaputa.

Dopo alcuni tentativi, ho scoperto che è solo qualcosa legato ai buffer dello schermo. stderr NON va meno in realtà. È possibile utilizzare i tasti freccia Su o Giù (o j / k) per dimostrare.

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.