web-dev-qa-db-fra.com

Est-il préférable d'éviter autant que possible d'utiliser "exit" dans les scripts bash?

On m'a dit en php qu'il était préférable d'éviter autant que possible d'utiliser la commande exit.

Est-ce la même chose pour bash?

Par exemple est la suivante

#!/bin/bash
if [ -z $1 ]; then
        echo You need to enter the directory you want to backup
else
        sourceFile=$1
        targetFile=/home/me/Desktop/myBackups/files_$(date +%Y_%m_%d_%s)
        tar cvf $targetFile $sourceFile
fi

Préféré à cela?

#!/bin/bash
if [ -z $1 ]; then
        echo You need to enter the directory you want to backup
        exit
fi
        sourceFile=$1
        targetFile=/home/me/Desktop/myBackups/files_$(date +%Y_%m_%d_%s)
        tar cvf $targetFile $sourceFile
4
user784637

Citant ' Code Complete '

Utilisez [exit] lorsque cela améliore la lisibilité Dans certaines routines, une fois que vous connaissez la réponse, vous souhaitez [quitter] immédiatement la routine d'appel. Si la routine est définie de telle sorte qu’elle ne nécessite aucun nettoyage supplémentaire une fois qu’elle détecte une erreur, ne pas [quitter] immédiatement signifie que vous devez écrire plus de code.

Donc normalement, une sortie est préférable (les personnes qui consultent votre code ne doivent pas trouver l’instruction de sortie correcte), mais la vérification des erreurs (en particulier au début d’un programme/programme comportant plusieurs instructions de sortie est plus claire.

Votre exemple est borderline, mais je dirais que le second est préférable pour que la maintenance de votre programme/script puisse le ranger.

Votre programme est actuellement (en psudocode)

if error condition 1
    // Show error message 1
else
    // Do stuff
fi

ou

if error condition 1
    // Show error message 1
    // exit
fi

// Do stuff

Une fois que votre programme a grandi, vous vous rendez compte de plusieurs autres façons que le programme peut échouer. Votre programme devient maintenant

if error condition 1
    // Show error message 1
else 
    if error condition 2
         // Show error message 2
    else
         if error condition 3
             // Show error message 3
         else
             // Do stuff
         fi
    fi
fi

ou peut-être

if error condition 1
    // Show error message 1
else if error condition 2
    // Show error message 2
else if error condition 3
    // Show error message 3
else
    // Do stuff
fi

versus

if error condition 1
    // Show error message 1
    // exit
else if error condition 2
    // Show error message 2
    // exit
else if error condition 3
    // Show error message 3
    // exit
fi

// Do stuff

Dans mon esprit, le dernier est le plus clair pour pouvoir identifier quels sont les cas d’erreur et quel est le flux principal du programme. Ajoutez maintenant différentes valeurs renvoyées (par exemple 0 en cas de succès, 1 en cas d'erreur 1, 2 en cas d'erreur 2, etc.) et la différence deviendra plus prononcée.

6
Portablejim

Je suppose que cela dépend du script dans une certaine mesure de votre code et de ce que vous essayez d'accomplir, des interruptions, du traitement des erreurs, etc.

En général, vous voulez soit spécifier un statut de sortie

exit 1

ou mis -e

#!/bin/bash -e

Vous pouvez ajouter la gestion des erreurs de différentes manières.

command 1 || echo "command 1 failed"

écrire des fonctions à des pièges.

Il y a quelques discussions de Nice (introduction) avec des références:

2
Panther

Ma préférence est la suivante:

#!/bin/bash
if [[ -z "$1" ]]; then
        # Notice that I added quotes and redirection
        echo "You need to enter the directory you want to backup" 1>&2
        exit
fi
# Notice that I fixed the indentation
sourceFile="$1"
targetFile="/home/me/Desktop/myBackups/files_$(date +%Y_%m_%d_%s)"
tar cvf "$targetFile" "$sourceFile"

Je pense que partir du moment où il est clair que le programme ne peut pas continuer ou où il est clairement terminé aboutit au code le plus propre.

Sur une note non liée, méfiez-vous des chaînes non citées dans Bash. Ils te mordront tôt ou tard. C'est une bonne habitude de toujours entourer les chaînes de guillemets (même lorsque c'est techniquement inutile) à moins que vous ne souhaitiez spécifiquement le comportement sans guillemets. Aussi, tant que vous utilisez bash, [[ est bien meilleur que [.

1
Scott Severance