web-dev-qa-db-fra.com

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

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!

22
Miguel Roque

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 >> au lieu de >

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

25
Nidal

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
15
graphite

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, je l'utilise dans mes dotfiles

4
wener

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
$ 
2
BurningKrome

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

2
harish.venkat

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

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

echo $error
0
Jonathan