Реализация пробного запуска в скрипте bash - PullRequest
0 голосов
/ 24 апреля 2018

Я ищу элегантный способ реализовать пробный запуск в одном из моих скриптов bash. Я нашел несколько способов сделать это, но ни один из них не соответствует моим потребностям.

Одна из них заключается в написании пробной функции, как предложено здесь: https://gist.github.com/pablochacin/32442fbbdb99165d6f7c

Но некоторые команды, которые я хочу выполнить, включают в себя каналы, и этот метод не совместим с каналами. Например, я хочу выполнить это в пробном режиме:

tar cf - drytestfile | 7z a -m0=lzma2 -mx=9 -mmt=$nbCores -si drytestfile.tar.7z | tee -a /tmp/testlog

Используя вышеописанный метод, я получу это в своем скрипте, где $ DRYRUN содержит имя функции, выполняющей эхо всех параметров:

$DRYRUN tar cf - drytestfile | 7z a -m0=lzma2 -mx=9 -mmt=$nbCores -si drytestfile.tar.7z | tee -a /tmp/testlog

Это, конечно, запустит функцию в первой части команды (имеется в виду tar) и передаст 7z результат этой функции. Не совсем то, что я ищу.

Может быть, вместо этого есть какая-то связь с командой eval, но я все еще не могу понять, как это реализовать ... Есть идеи?

1 Ответ

0 голосов
/ 24 апреля 2018

Поскольку вы работаете с конвейером, вам нужно иметь «$ DRYRUN» для всех команд в строке. Если вы просто добавите $ DRYRUN перед всеми командами, это сработает, но вы увидите только результат последней команды. Если вы хотите показать все команды, одним из способов было бы изменить функцию dryrun, т.е. ( Отредактировано согласно комментариям Чарльза Даффи ):

dryrun() {
    if [[ ! -t 0 ]]
    then
        cat
    fi
    printf -v cmd_str '%q ' "$@"; echo "DRYRUN: Not executing $cmd_str" >&2
}

Тогда вы можете сделать:

$DRYRUN tar cf - drytestfile | \
$DRYRUN 7z a -m0=lzma2 -mx=9 -mmt=$nbCores -si drytestfile.tar.7z | \
$DRYRUN tee -a /tmp/testlog

Например:

dryrun echo "hello" | \
dryrun echo "world" | \
dryrun echo "foo" | \
dryrun echo "bar"

Будет производить:

DRYRUN: Not executing command echo hello
DRYRUN: Not executing command echo world
DRYRUN: Not executing command echo foo
DRYRUN: Not executing command echo bar
...