Как реализовать опцию пробного запуска в сценарии 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`
Это просто неправильно, и есть способ лучше?
Я хотел поиграть с ответом от @Dennis Williamson. Вот что у меня получилось:
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
Видеть BashFAQ / 050: Я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу! для обсуждения этой темы.
Хотя сейчас удален, раздел Как добавить возможность тестирования в программы все еще может быть полезно.