Является ли предпочтительным избегать использования & ldquo; exit & rdquo; в bash скриптах как можно больше?

Мне сказали в php, что лучше избегать использования команды выхода, насколько это возможно.

То же самое верно для bash?

Например, предпочтительнее ли следующее

#!/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

?]

#!/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
задан 5 December 2011 в 09:23

3 ответа

Заключение в кавычки 'завершенного кода'

Используйте [выходят], когда это улучшает удобочитаемость В определенных стандартных программах, после того как Вы знаете ответ, Вы хотите [выйти] к вызывающей подпрограмме сразу. Если стандартная программа определяется таким способом, которым она не требует дальнейшей очистки, после того как она обнаруживает ошибку, [не выходить] сразу означает, что необходимо написать больше кода.

Таким образом, обычно один выход предпочтен (люди, смотрящие на Ваш код, не должны находить, что корректный оператор выхода), однако с проверкой ошибок (особенно в начале программы/стандартной программы, имеющей несколько операторов выхода, более ясно.

Вашим примером является граница, однако я сказал бы, что второе предпочтено так, чтобы обслуживание к Вашей программе/сценарию могло оставить это опрятным.

Ваша программа в настоящее время (в psudocode)

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

или

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

// Do stuff

После того как Ваша программа выросла, Вы понимаете еще некоторые способы, которыми может перестать работать программа. Ваша программа теперь становится

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

или возможно

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

по сравнению с

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

В моем уме последний является самым ясным в способности определить, который является ошибочными случаями и который является основным потоком программы. Теперь добавьте возвращающие различные значения (например, 0 на успехе, 1 на ошибке 1, 2 на ошибке 2, и т.д.), и различие станет более явным.

6
ответ дан 5 December 2011 в 09:23

Мое предпочтение таково:

#!/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"

Я думаю, что выход в тот момент, когда становится ясно, что программа не может продолжаться или где она явно завершена, создает самый чистый код.

На несвязанной ноте, остерегайтесь строк без кавычек в Bash. Рано или поздно тебя укусят. Это хорошая привычка всегда заключать строки в двойные кавычки (даже если это технически не нужно), если только вы не хотите использовать поведение без кавычек. Кроме того, если вы используете bash, [[ намного лучше, чем [.

0
ответ дан 5 December 2011 в 09:23

Я предполагаю, что это зависит от сценария в некоторой степени на Вашем коде и что Вы пытаетесь выполнить, прерывания, обработка ошибок, и т.д.

В целом Вы идете к любому, хотят указать статус выхода

exit 1

или набор-e

#!/bin/bash -e

Можно добавить управление обработкой ошибок во множестве путей

command 1 || echo "command 1 failed"

к записи функций к прерываниям.

Существует несколько хороших (вводных) обсуждений со ссылками:

2
ответ дан 5 December 2011 в 09:23

Другие вопросы по тегам:

Похожие вопросы: