Как реализовать опцию пробного запуска в скрипте bash?
Я могу предложить либо обернуть каждую отдельную команду в if и вывести ее на экран вместо ее запуска, если скрипт выполняется в режиме «dry-run».
Другой способ — определить функцию, а затем передавать каждый вызов команды через эту функцию.
Что-то вроде:
function _run () {
if [[ "$DRY_RUN" ]]; then
echo $@
else
$@
fi
}
`_run mv /tmp/file /tmp/file2`
`DRY_RUN=true _run mv /tmp/file /tmp/file2`
Неужели это неправильно и есть гораздо лучший способ сделать это?
решение1
ВидетьBashFAQ/050: Я пытаюсь поместить команду в переменную, но сложные случаи всегда терпят неудачу!для обсуждения этой темы.
Хотя сейчас этот раздел удален,Как добавить возможность тестирования в программыможет быть еще полезен.
решение2
Я хотел поиграть с ответом @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