201 votes

Comment stocker de l'erreur-type d'une variable dans un script Bash

Disons que j'ai un script comme suit:

useless.sh

echo "This Is Error" 1>&2
echo "This Is Output"

Et j'ai un autre script shell:

alsoUseless.sh

./useless.sh | sed 's/Output/Useless/'

Je veux capturer "C'Est une Erreur", ou toute autre stderr de useless.sh, dans une variable. Appelons ça de l'ERREUR.

Notez que j'utilise stdout pour quelque chose. Je veux continuer à utiliser la sortie standard, afin de rediriger stderr vers stdout n'est pas utile dans ce cas.

Donc, fondamentalement, je veux faire

./useless.sh 2> $ERROR | ...

mais qui de toute évidence ne fonctionne pas.

Je sais aussi que je pourrais faire

./useless.sh 2> /tmp/Error
ERROR=`cat /tmp/Error`

mais c'est laid et inutile.

Malheureusement, si pas de réponses tourner jusqu'ici c'est ce que je vais avoir à faire.

J'espère qu'il y a une autre manière.

N'importe qui ont des idées?

106voto

Jonathan Leffler Points 299946

Il serait plus propre à la capture de l'erreur de fichier ainsi:

ERROR=$(</tmp/Error)

Le shell reconnaît ce fait et n'ont pas à exécuter 'cat' pour obtenir les données.

La grande question est difficile. Je ne pense pas qu'il ya un moyen facile de le faire. Vous devez construire l'ensemble de la canalisation dans le sous-shell, finalement, l'envoi de sa dernière sortie standard vers un fichier, de sorte que vous pouvez rediriger les erreurs sur la sortie standard.

ERROR=$( { ./useless.sh | sed s/Output/Useless/ > outfile; } 2>&1 )

Notez que le point-virgule est nécessaire (dans le classique de coquillages - Bourne, Korn - bien sûr; probablement en Bash trop). Le '{}"ne redirection d'e/S sur le joint de commandes. Comme l'a écrit, il capture des erreurs d' sed trop.

(Officiellement du code non testé - utilisez à votre propre risque.)

77voto

Chas. Owens Points 40887

Redirigé stderr vers stdout, stdout vers /dev/null, puis utilisez les backticks ou $() de la capture de la redirection de stderr:

ERROR=$(./useless.sh 2>&1 >/dev/null)

72voto

Dennis Williamson Points 105818

alsoUseless.sh

Cela vous permettra de rediriger la sortie de votre useless.sh script par le biais d'une commande telle que sed et économiser de l' stderr dans une variable nommée error. Le résultat de la pipe est envoyé à stdout pour l'affichage ou pour être joué dans une autre commande.

Il met en place un couple d'extra descripteurs de fichiers pour gérer les redirections nécessaires pour ce faire.

#!/bin/bash

exec 3>&1 4>&2 #set up extra file descriptors

error=$( { ./useless.sh | sed 's/Output/Useless/' 2>&4 1>&3; } 2>&1 )

echo "The message is \"${error}.\""

exec 3>&- 4>&- # release the extra file descriptors

3voto

tfga Points 1

Voici comment j'ai fait :

#
# $1 - name of the (global) variable where the contents of stderr will be stored
# $2 - command to be executed
#
captureStderr()
{
    local tmpFile=$(mktemp)

    $2 2> $tmpFile

    eval "$1=$(< $tmpFile)"

    rm $tmpFile
}

Exemple d'utilisation :

captureStderr err "./useless.sh"

echo -$err-

Il ne utilisation d'un fichier temporaire. Mais au moins le vilain truc est enveloppé dans une fonction.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X