É preferível evitar o uso de “exit” nos scripts bash o máximo possível?

4

Foi-me dito no php que é preferível evitar o uso do comando de saída, tanto quanto possível.

O mesmo acontece com o bash?

Por exemplo, o seguinte

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

Preferido a isso?

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

3 respostas

6

Citando ' Código concluído '

  

Use [sair] quando aumenta a legibilidade Em certas rotinas, uma vez   você sabe a resposta, você quer [sair] para a rotina de chamada   imediatamente. Se a rotina é definida de tal forma que não   requer qualquer limpeza adicional, uma vez que detecta um erro, não [saindo]   significa imediatamente que você tem que escrever mais código.

Portanto, normalmente é preferível uma saída (as pessoas que olham para o seu código não precisam encontrar a instrução de saída correta), mas a verificação de erros (especialmente no início de um programa / rotina com várias instruções de saída é mais clara).

Seu exemplo é limítrofe, no entanto, eu diria que o segundo é o preferido para que a manutenção do seu programa / script possa deixá-lo organizado.

Seu programa atualmente é (em 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

Uma vez que seu programa tenha crescido, você perceberá algumas outras maneiras de o programa falhar. Seu programa agora se torna

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 talvez

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

Na minha opinião, o último é o mais claro em ser capaz de identificar quais são os casos de erro e qual é o fluxo principal do programa. Agora adicione valores diferentes retornados (por exemplo, 0 em sucesso, 1 em erro 1, 2 em erro 2, etc.) e a diferença se tornará mais pronunciada.

    
por Portablejim 05.12.2011 / 07:27
2

Suponho que depende do script, até certo ponto, em seu código e no que você está tentando realizar, armadilhas, tratamento de erros, etc.

Em geral, você quer especificar um status de saída

exit 1

ou defina -e

#!/bin/bash -e

Você pode adicionar gerenciamento de erros de várias maneiras

command 1 || echo "command 1 failed"

para escrever funções para armadilhas.

Há algumas discussões agradáveis (introdutórias) com referências:

por Panther 05.12.2011 / 06:39
1

Minha preferência é esta:

#!/bin/bash
if [[ -z "" ]]; 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=""
targetFile="/home/me/Desktop/myBackups/files_$(date +%Y_%m_%d_%s)"
tar cvf "$targetFile" "$sourceFile"

Acho que sair no ponto em que fica claro que o programa não pode continuar ou onde está claramente concluído faz com que o código seja mais limpo.

Em uma nota não relacionada, tenha cuidado com strings sem aspas no Bash. Eles vão te morder mais cedo ou mais tarde. É um bom hábito sempre cercar strings com aspas duplas (mesmo quando isso é tecnicamente desnecessário), a menos que você queira especificamente o comportamento sem aspas. Além disso, contanto que você esteja usando bash, [[ é muito melhor que [ .

    
por Scott Severance 05.12.2011 / 09:33