Реализация пробного запуска в скриптах bash

15

Как реализовать опцию пробного запуска в скрипте bash?

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

Другим способом было бы определить функцию и затем передавать каждый вызов команды через эту функцию.

Что-то вроде:

function _run () {
    if [[ "$DRY_RUN" ]]; then
        echo $@
    else
        $@
    fi
}

`_run mv /tmp/file /tmp/file2`

`DRY_RUN=true _run mv /tmp/file /tmp/file2`

Это просто неправильно, и есть намного лучший способ сделать это?

Андрей Серделюк
источник
Итак, вы хотите напечатать, что будет делать команда (включая значения $ VARIABLES) без фактического выполнения команды. Я использую что-то вроде вашей _run()функции, иногда с помощью 'set -xv', но я бы хотел лучше.
Стефан Ласевски,
да, именно это Мне интересно, нет ли внутренней переменной, которую вы можете установить в bash, чтобы команды фактически не выполнялись, вместо того, чтобы передавать их через функцию
Андрей Серделюк
2
Нет причин, по которым этот вопрос должен был быть отмечен сообществом вики.
Приостановлено до дальнейшего уведомления.
Баш это оболочка. Там нет никаких причин для этого, чтобы сделать пробные прогоны. Я не думаю, что есть лучший способ сделать это, чем вы уже сделали.
d -_- b

Ответы:

2

Смотрите BashFAQ / 050: я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу! для обсуждения этой темы.

Несмотря на то, что теперь этот раздел удален, раздел « Как добавить возможность тестирования в программы» может быть полезен.

Деннис Уильямсон
источник
Не альтернатива, но выглядит как отличный ресурс для тестирования и работы с более длинными программами bash.
Андрей Серделюк
Я откатил редактирование, которое добавило привязку к определенной части связанной страницы, так как смысл моего ответа, как было сказано, состоит в том, чтобы прочитать обсуждение целиком, а не указать на одну конкретную часть с практическими рекомендациями. Смысл связанной страницы, как правило, состоит в том, чтобы избегать помещения команд для выполнения в переменные, поскольку есть много ошибок.
Приостановлено до дальнейшего уведомления.
Было бы гораздо полезнее, если бы этот ответ суммировал основные моменты этой статьи. Однострочные ответы все еще плохие ответы.
Марк Бут
4

Я хотел поиграть с ответом @Dennis Williamson's. Вот что я получил:

Run () {
    if [ "$TEST" ]; then
        echo "$*"
        return 0
    fi

    eval "$@"
}

Здесь eval "$@"важно, и это лучше, чем просто делать $*. $@возвращает все параметры и $*возвращает все параметры без пробелов и кавычек.

$ mkdir dir
$ touch dir/file1 dir/file2
$ FOO="dir/*"
$ TEST=true Run ls -l $FOO
ls -l dir/file1 dir/file2
$ Run ls -l $FOO
-rw-r--r--  1 stefanl  stefanl  0 Jun  2 21:06 dir/file1
-rw-r--r--  1 stefanl  stefanl  0 Jun  2 21:06 dir/file2
Stefan Lasiewski
источник