Come acquisire il messaggio di errore dal comando eseguito?


20

Mi è stato assegnato il compito di creare uno script di protezione avanzata del server e una cosa di cui hanno bisogno è un rapporto di tutto l'output di ciascun comando eseguito. Voglio archiviare il messaggio di errore all'interno di una stringa e aggiungerlo in un file di testo.

Diciamo che ho eseguito questo comando:

/sbin/modprobe -n -v hfsplus

L'output di eseguirlo nella mia macchina sarebbe:

FATAL: Module hfsplus not found

Come posso memorizzare quel messaggio di errore all'interno di una stringa? Qualsiasi aiuto sarebbe molto apprezzato. Grazie!


Ho provato a eseguire questo comando: var = $ (/ sbin / modprobe -n -v hfsplush) E poi visualizzandolo: $ var Ma non cattura ancora il messaggio di errore all'interno della stringa.
Miguel Roque,

Risposte:


23

puoi farlo reindirizzando il comando errori:

/sbin/modprobe -n -v hfsplus 2> fileName 

come una sceneggiatura

#!/bin/bash
errormessage=$( /sbin/modprobe -n -v hfsplus 2>&1)
echo $errormessage

o

 #!/bin/bash
errormessage=`/sbin/modprobe -n -v hfsplus 2>&1 `
echo $errormessage

se si desidera aggiungere l'errore, utilizzare >>invece di>

Assicurati di utilizzare 2>&1e di non 2> &1evitare l'errore "errore di sintassi vicino token imprevisto` & '"


Ho provato questo approccio e lo memorizza DIRETTAMENTE nel file di testo. Voglio che sia memorizzato prima in una stringa in modo da poter formattare facilmente il contenuto.
Miguel Roque,

1
@MiguelRoque vedi aggiornamenti
Networker,

1
Ho provato a inserire l'output in un HEREDOC e ha funzionato anche. Grazie mille @Networker!
Miguel Roque,

1
Qualcuno ha ripristinato la modifica che ho fatto, perché avevo un "errore di sintassi vicino a &" e ho rimosso lo spazio dopo>. Una giustificazione sarebbe stata piacevole.
Pierre.Sassoulas,

Ho provato a modificare perché: assicurati di utilizzare 2> & 1 e non 2> & 1 per evitare l'errore "errore di sintassi vicino token imprevisto` & '"
peter_v,

15

Semplicemente da memorizzare come stringa nello script bash:

X=`/sbin/modprobe -n -v hfsplus 2>&1`
echo $X

Questo può essere un po 'migliore in quanto vedrai i messaggi quando viene eseguito il comando:

TMP=$(mktemp)
/sbin/modprobe -n -v hfsplus 2>&1 | tee $TMP
OUTPUT=$(cat $TMP)
echo $OUTPUT
rm $TMP

1
Utilizzare sempre $ (comando) anziché i backtick per la sostituzione dei comandi. È meglio :)
Sree,

So che è meglio (ho avuto meno problemi usando $ ()), ma perché?
KolonUK il

4

Catturo un errore del genere

. ${file} 2>&1 | {
  read -d "\0" -t 0.01 error
    [ -z "$error" ] || log_warn Load completion ${file} failed: "\n${error}"
}

se la fonte fallisce, catturerò l'errore e registrerò it.log_warn è solo una semplice funzione.

A proposito, lo uso nei miei dotfile


2

Per aggiungere a un file utilizzare /sbin/modprobe -n -v hfsplus 2>> filename


2

Versioni bash più recenti (vale a dire bash 4.1+):

$ msg=$(ls -la nofile 2>&1)
$ echo $msg
ls: cannot access nofile: No such file or directory
$ 

0

Per restituire il messaggio di errore in una variabile, semplicemente;

error=$(/sbin/modprobe -n -v hfsplus 2>&1 1>/dev/null)

echo $error
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.