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!
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" & ""
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
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
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
$
Pour ajouter à un fichier, utilisez /sbin/modprobe -n -v hfsplus 2>> filename
Pour renvoyer le message d'erreur dans une variable, simplement;
error=$(/sbin/modprobe -n -v hfsplus 2>&1 1>/dev/null)
echo $error