Comment capturer le message d'erreur de la commande exécutée?

20

J'ai été chargé de créer un script de renforcement automatique du serveur et une chose dont ils ont besoin est un rapport de toutes les sorties de chaque commande exécutée. Je veux stocker le message d'erreur dans une chaîne et l'ajouter dans un fichier texte.

Disons que j'ai exécuté cette commande:

/sbin/modprobe -n -v hfsplus

Le résultat de l'exécution de ceci dans ma machine serait:

FATAL: Module hfsplus not found

Comment puis-je stocker ce message d'erreur dans une chaîne? Toute aide serait grandement appréciée. Merci!

Miguel Roque
la source
J'ai essayé d'exécuter cette commande: var = $ (/ sbin / modprobe -n -v hfsplush) Et puis l'afficher: $ var Mais il ne capture toujours pas le message d'erreur à l'intérieur de la chaîne.
Miguel Roque

Réponses:

23

vous pouvez le faire en redirigeant la commande des erreurs:

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

comme script

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

ou

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

si vous souhaitez ajouter l'erreur, utilisez >>plutôt que>

Assurez-vous d'utiliser 2>&1et de ne 2> &1pas éviter l'erreur "erreur de syntaxe près du jeton inattendu` & '"

Networker
la source
J'ai essayé cette approche et elle la stocke DIRECTEMENT dans le fichier texte. Je veux qu'il soit d'abord stocké dans une chaîne afin que je puisse facilement formater le contenu.
Miguel Roque
1
@MiguelRoque voir les mises à jour
Networker
1
J'ai essayé de mettre la sortie dans un HEREDOC et cela a également fonctionné. Merci beaucoup @Networker!
Miguel Roque
1
Quelqu'un a annulé la modification que j'ai effectuée, car j'avais une "erreur de syntaxe près de &" et j'ai supprimé l'espace après>. Une justification aurait été bien.
Pierre.Sassoulas
J'ai essayé de modifier car: Assurez-vous d'utiliser 2> & 1 et non 2> & 1 pour éviter l'erreur "erreur de syntaxe près du jeton inattendu` & '"
peter_v
15

Simplement pour stocker en tant que chaîne dans le script bash:

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

Cela peut être un peu mieux car vous verrez des messages lorsque la commande est exécutée:

TMP=$(mktemp)
/sbin/modprobe -n -v hfsplus 2>&1 | tee $TMP
OUTPUT=$(cat $TMP)
echo $OUTPUT
rm $TMP
graphite
la source
1
Utilisez toujours $ (commande) au lieu de backticks pour la substitution de commande. C'est mieux :)
Sree
Je sais que c'est mieux (j'ai eu moins de problèmes avec $ ()), mais pourquoi?
KolonUK
4

Je capture une erreur comme celle-ci

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

si la source a échoué, je vais capturer l'erreur et l'enregistrer. log_warn n'est qu'une simple fonction.

BTW, j'utilise ceci dans mes fichiers dot

wener
la source
2

Pour ajouter à un fichier, utilisez /sbin/modprobe -n -v hfsplus 2>> filename

harish.venkat
la source
2

Versions bash plus récentes (ie bash 4.1+):

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

Pour renvoyer le message d'erreur dans une variable, simplement;

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

echo $error
Jonathan
la source