2010-01-19 9 views
1

Donc, l'idée est d'avoir un script qui essaie d'exécuter une commande, et si la commande échoue, elle affiche des avertissements/erreurs. Mon essai:Un script shell "try"

$ cat try.sh 
#! /bin/sh 
tempfile=`tempfile 2>/dev/null` || tempfile=/tmp/temp$$ 
trap 'rm -f $tempfile >/dev/null 2>&1' 0 
trap 'exit 2' 1 2 3 15 

echo "[email protected]" 
if ! "[email protected]" >$tempfile 2>&1; then 
    cat $tempfile; 
    false; 
fi 

Pensez-vous que ce script est correct (par rapport à la portabilité et à la fonctionnalité)?

+0

Personnellement, je réécrire ce en Python. J'admire les gens qui peuvent lancer des programmes de travail complexes avec des scripts shell, mais je ne prendrais pas ce risque moi-même. –

+0

Qu'est-ce qu'un script qui exécute une commande vous permet d'exécuter directement la commande? –

+1

@Steve, vraisemblablement cela ferait partie d'un script plus grand, pour supprimer la sortie quand une commande n'échoue pas – bdonlan

Répondre

1

Quelques changements que je voudrais faire:

  • Utilisez "[email protected]" comme Steve Emmerson a suggéré
  • Ne pas rediriger stdout de tempfile-/dev/null; c'est ce que vous essayez de capturer dans la variable!
  • Envisager mktemp; c'est plus portable.
  • Capturez et quittez avec le code de sortie réel, de sorte que les informations ne soient pas perdues.

Par ex, sans contrôle d'erreur,

tempfile=`mktemp 2>/dev/null || echo /tmp/tempfile$$` 
[ -w "$tempfile" ] || { echo "Can't make tempfile" >&2; exit 1; } 
"[email protected]" 2> $tempfile 
rc=$? 
case $rc in 
    0) ;; 
    *) cat "$tempfile" >&2 ;; 
esac 
rm -f "$tempfile" 
exit $rc 
+0

Merci pour les remarques. –

1

Je placerais les guillemets doubles $ @ dans l'instruction "if" afin de préserver les limites des mots.