Реалізація біг-сценарію в скриптах 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.