2010-06-14 20 views
4

J'ai un script shell tcsh que je voudrais arrêter avec une erreur sur un état non nul la plupart du temps, mais dans certains cas je veux l'ignorer. Par exemple:Comment exécuter une commande shell tcsh et ignorer sélectivement l'état?

#!/bin/tcsh -vxef 

cp file/that/might/not/exist . #Want to ignore this status 
cp file/that/might/not/exist . ; echo "this doesn't work" 
cp file/that/must/exist . #Want to stop if this status is nonzero 
+1

La programmation de csh est considérée comme dangereuse. sérieusement. http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ – msw

+0

Je regarde un problème similaire. Il semble que tcsh traite les commandes intégrées (comme cd et limite) différemment des commandes externes (comme false). Les commandes intégrées entraînent toujours la fin du script indépendamment de -e. En outre, "echo last command failed" ne fonctionne pas comme prévu. Avec -e la partie après || n'est jamais appelé. Sans -e la partie après || est appelé comme prévu, mais pour une commande intégrée, vous quitterez le script juste après cela. Yuck! –

Répondre

3

Here we go: Spawn un nouveau shell, utilisez ';' ignorer le premier état, et tout retourne clair.

$SHELL -c 'cp file/that/might/not/exist . ; echo "good"' 
+0

Envisagez de remplacer "echo good" par ":" pour éviter tout écho. – macetw

+0

Cette solution fonctionne même pour bash. – macetw

3

Je ne sais pas tcsh, mais avec bash, vous pouvez utiliser set -e pour ce faire. Lorsque le drapeau -e est positionné, bash va quitter immédiatement si une sous-commande échoue (voir le manuel pour les détails techniques). Lorsqu'il n'est pas défini, il continuera à s'exécuter. Ainsi, vous pouvez faire quelque chose comme ceci:

set +e 
cp file/that/might/not/exist . # Script will keep going, despite error 
set -e 
cp file/that/might/not/exist . # Script will exit here 
echo "This line is not reached" 
2
mustsucceed || exit 1 
mustbeignored || : 
+0

Cela ne fonctionne pas pour moi. Le script s'arrête toujours. –

+1

@Walter, alors vous ne devez pas utiliser '-e' lorsque vous appelez le shell. –

+0

@glennjackman, comme il l'a déclaré au début de la question, il "aimerait arrêter avec une erreur sur le statut non nul la plupart du temps." C'est pourquoi nous faisons cela avec un contexte '-e'. – macetw

1

Si vous ne vous inquiétez pas si elle échoue, retirez le -e de votre tralala. @ La réponse d'Adam aurait dû vous donner un indice si vous aviez regardé le tcsh documentation.

En outre, vous pouvez jeter le message d'erreur:

cp dont_care  . >& /dev/null 
cp still_dont_care . >& /dev/null || echo "not there" 
cp must_be_there . >& /dev/null || exit 1 # oh noes! 
+0

La plupart du temps, je m'inquiète si cela échoue. Pour quelques cas exceptionnels, je m'en fous. –

+1

Tant que ce 'e' est présent dans' #!/Bin/tcsh -vxef', il sortira toujours en cas d'erreur; c'est ce que fait le 'e'. Vous devez supprimer le 'e' pour obtenir un autre comportement. '' – frayser