Comment faire pour obtenir une sortie d'une commande bash dans une variable
J'ai suivi à travers certaines des questions similaires (tels que Comment définir une variable à la sortie d'une commande Bash?), cependant les réponses acceptées semblent être non-travail pour moi. Je n'étais pas sûr si je dois faire dérailler quelqu'un d'autre question ou poster mon propre copie, alors, toutes mes excuses si j'ai choisi de mal ici.
Je souhaite obtenir la sortie et code de sortie d'un un certain nombre de commandes dans un script que je suis en train de monter ensemble. Voici un exemple de ce que j'ai été en utilisant:
cmd_output=$(rm $file)
exit_status=$?
if [ "${exit_status}" -eq 0 ]
then
log "Successfully removed the original" ${TAB_LEVEL}
else
fail "Failed to remove the original, the output was: \n ${cmd_output}"
fi
Le journal et ne parviennent pas les fonctions sont:
# Usage: fail "Failure message"
function fail {
echo "FATAL ERROR: $1" >> "${LOG_DIR}/${LOG_FILE}"
exit 1
}
# Usage: log "Log message" 3 Where the tab-level is 3.
function log {
if (("" > 0))
then
eval "printf ' %.0s' {1..$2}" >> "${LOG_DIR}/${LOG_FILE}"
fi
echo "$1" >> "${LOG_DIR}/${LOG_FILE}"
return 0
}
Dans l'exemple ci-dessus, je utiliser le $(cmd), mais j'ai aussi essayé d'utiliser les backticks.
Dans mon fichier journal, tout ce que je vois quand il ya un défaut est:
ERREUR FATALE: impossible de supprimer l'original, la sortie est: \n
Également, la sortie de l'échec de commandes se termine sur l'écran comme à son habitude. Est-il une raison pour laquelle mon cmd_output variables serait reste vide?
OriginalL'auteur Chris O'Kelly | 2012-10-05
Vous devez vous connecter pour publier un commentaire.
Vous devez inclure la sortie de la spéciale de la sortie d'erreur standard de flux:
Il y a trois flux par défaut sur tous les programmes (qui sont numérotés de descripteurs de fichiers):
Ainsi, pour capter les messages d'erreur, il faut rediriger la sortie d'erreur standard (stderr) dans la sortie standard (stdout) qui sera ensuite capturé par les
$(...)
expression.La syntaxe pour la redirection est par le biais de la
>
"opérateur". Immédiatement avant de vous dire qui descripteur de fichier de redirection (la valeur par défaut est 1, ce qui est stdout). Et vous pouvez le spécifier pour rediriger vers un fichier. Si vous écrivez une esperluette (&
) après cela, vous forcer à les rediriger vers un autre descripteur de fichier. Par conséquent, dans cet exemple, nous rediriger descripteur de fichier 2 (stderr) dans le fichier descripteur 1 (stdout).Vous pouvez également rediriger les entrées avec
<
"opérateur", mais dans ce cas, le descripteur de fichier par défaut est 0 (stdin).Une autre observation est qu'il est probablement une bonne pratique pour placer votre
$file
variable entre guillemets, dans le cas où il a un espace blanc caractères.Espère que cela vous aide un peu =)
Hey Janito, Merci beaucoup pour votre réponse! Je suis conscient du fait que les trois flux standard et les opérateurs de redirection, mais la seule raison pour laquelle j'ai utilisé jusqu'à présent est d'envoyer le tout à partir d'une commande vers /dev/null ou dans un fichier journal. Je n'ai même pas envisager les différents cours d'eau ici. L' $fichier variable a été fait à l'origine dans les citations, je l'ai sorti de guillemets lorsque je testais l'erreur attraper les fonctions de mon script, à la force d'une erreur. Encore une fois, merci beaucoup!
OriginalL'auteur Janito Vaqueiro Ferreira Filho
*nix de commande comportent généralement deux formes de sortie: la sortie standard (
stdout
) et erreur standard (stderr
).FOO=$(...)
ne saisitstdout
, et les feuillesstderr
sans entrave.Si vous souhaitez que le contenu de
stderr
avec cette syntaxe, vous avez besoin de postfix votre commande avec2>&1
de sorte questderr
est fusionné dansstdout
. (par exemple, comme suit:rm $file 2>&1
)OriginalL'auteur antak
Depuis votre
fail
fonction est juste de quitter, il serait beaucoup plus simple de faire:La seule différence entre cela et l'original du code, c'est qu'il n'a pas
imprimer le texte
FATAL ERROR:
. Depuis la concision est une vertu, il serait probablementêtre préférable de sauter le
log
fonction entièrement. Les erreurs d'un rapport très fort; réussirsilencieusement.
OriginalL'auteur William Pursell