Domanda Come reindirizzare lo stderr in un file [duplicato]


Questa domanda ha già una risposta qui:

Durante l'utilizzo di nohup per inserire un comando per l'esecuzione in background alcuni contenuti appaiono nel terminale.

cp: error reading ‘/mnt/tt/file.txt’: Input/output error
cp: failed to extend ‘/mnt/tt/file.txt’: Input/output error

Voglio salvare quel contenuto in un file.


161
2018-05-18 12:31


origine




risposte:


Esistono due flussi di output principali in Linux (e altri sistemi operativi), output standard (stdout) e standard error (stderr). I messaggi di errore, come quelli che mostri, vengono stampati per errore standard. Il classico operatore di reindirizzamento (command > file) reindirizza solo l'output standard, quindi l'errore standard viene ancora visualizzato sul terminale. Per reindirizzare anche lo stderr, hai alcune scelte:

  1. Reindirizza lo stdout in un file e stderr in un altro file:

    command > out 2>error
    
  2. Reindirizza lo stderr allo stdout (&1), quindi reindirizzare lo stdout in un file:

    command >out 2>&1
    
  3. Reindirizza sia a un file:

    command &> out
    

Per ulteriori informazioni sui vari operatori di controllo e reindirizzamento, vedere Qui.


262
2018-05-18 12:50



Così hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2> error_hashdeep.txt & o hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ >> result_hashdeep.txt 2>&1 o hashdeep -rXvvl -j 30 -k checksums.txt /mnt/app/ &> result_mixed.txt - André M. Faria
@ AndréM.Faria sì. Ma gli ultimi due comandi sono equivalenti, invieranno sia errori che output allo stesso file. - terdon♦
Come nel link che hai fornito, potrei usare | & invece di 2> & 1 sono equivalenti, grazie per il tuo tempo. - André M. Faria
Ciao, sono stato in grado di semplificare questo a: command 2> out. - Surya Teja Karra
@SuryaTejaKarra che reindirizza solo stderr, ma non stdout. - terdon♦


La prima cosa da notare è che ci sono un paio di modi a seconda del tuo scopo e shell, quindi questo richiede una leggera comprensione di molteplici aspetti. Più tipico, è via 2> in Conchiglie di tipo Bourne, ad esempio dash (che è collegato simbolicamente /bin/sh) e bash; la prima è la shell predefinita e conforme a POSIX e l'altra è ciò che la maggior parte degli utenti usa per la sessione interattiva. Differiscono per sintassi e funzionalità, ma fortunatamente per noi il reindirizzamento del flusso di errori funziona allo stesso modo (eccetto il file &> non standard). Nel caso di csh e dei suoi derivati, il reindirizzamento dello stderr non funziona abbastanza lì.

Torniamo a 2> parte. Due cose fondamentali da notare: > significa operatore di reindirizzamento, dove apriamo un file e 2 intero rappresenta il descrittore di file stderr; in effetti questo è esattamente il modo in cui lo standard POSIX per il linguaggio shell definisce il reindirizzamento sezione 2.7:

[n]redir-op word

Per semplice > reindirizzamento, il 1 per intero è implicito stdout, cioè echo Hello World > /dev/null è proprio come echo Hello World 1>/dev/null. Si noti che l'operatore di numeri interi o di reindirizzamento non può essere quotato, altrimenti la shell non li riconosce come tali e invece tratta come una stringa di testo letterale. Per quanto riguarda la spaziatura, è importante che il numero intero sia proprio accanto all'operatore di reindirizzamento, ma il file può essere accanto all'operatore di reindirizzamento o meno, ad es. command 2>/dev/null e command 2> /dev/null funzionerà bene

La sintassi alquanto semplificata per il tipico comando nella shell sarebbe

 command [arg1] [arg2]  2> /dev/null

Il trucco qui è che il reindirizzamento può apparire ovunque. Questo è entrambi 2> command [arg1] e command 2> [arg1] sono validi Si noti che per bash shell, là esiste &> modo per reindirizzare contemporaneamente i flussi stdout e stderr, ma ancora una volta: è bash specifico e se si sta cercando la portabilità degli script, potrebbe non funzionare. Guarda anche Wiki di Ubuntu e Qual è la differenza tra &> e 2> & 1.

Nota: Il > operatore di reindirizzamento troncaun file e lo sovrascrive, se il file esiste. Il 2>> può essere usato per l'aggiunta stderr archiviare.

Se puoi notare, > è pensato per un singolo comando. Per gli script, possiamo reindirizzare lo stream stderr dell'intero script dall'esterno come in myscript.sh 2> /dev/null o possiamo fare uso di exec integrato. L'exec built-in ha il potere di ricablare il flusso per l'intera sessione della shell, per così dire, sia interattivamente che tramite script. Qualcosa di simile a

#!/bin/sh
exec 2> ./my_log_file.txt
stat /etc/non_existing_file

In questo esempio, dovrebbe essere mostrato il file di log stat: cannot stat '/etc/non_existing_file': No such file or directory.

Ancora un altro modo è tramite le funzioni. Come kopciuszek annotato nella sua risposta, possiamo scrivere la dichiarazione di funzione con il reindirizzamento già allegato, cioè

some_function(){
    command1
    command2
} 2> my_log_file.txt

4
2018-05-03 07:48