2

Каков наилучший способ условно выполнить перенаправление в Bash для целей тестирования и отладки?

В моих сценариях я добавляю опцию отладки, чтобы показать, что было бы эффективно при выполнении тестового прогона без какой-либо обработки. Если опция отладки включена, я хочу, чтобы опция DEBUG отображала строку сценария с перенаправлением, эффективно повторяя перенаправление и не перенаправляя эхо. Пример, вероятно, объяснит это лучше:

В сценарии, который будет выполнять mysqldump, используя переданные ему аргументы, я бы хотел, чтобы опция отладки показывала команду mysqldump так, как она бы выполнялась, если бы не опция -d.

[ "-d" = "$1" ] && DEBUG=echo
$DEBUG mysqldump -u"$user" -p"$pass" -h"$host" "$dbase" > $dbase.sql.dump

Поэтому, если я повторяю причину, по которой DEBUG имеет значение "echo", я НЕ хочу отображать "$ dbase.sql.dump". Я действительно хочу отобразить переменную ">" и "$ dbase" с помощью ".sql.dump". "текст. Если опция отладки не включена, я хочу выполнить команду как есть.

Параметры set -x и set -v самом деле не являются ответом здесь, так как отладка - это всего лишь опция тестового вывода / пробного запуска, которую может видеть пользователь, а не отладка сценария для устранения проблем кодирования.

1 ответ1

2

Проблема будет избегать всего правильно. Почему бы вам не попробовать немного другой подход, как это:

CMD='mysqldump -u"$user" -p"$pass" -h"$host" "$dbase" > "$dbase.sql.dump"';
[ "-d" = "$1" ] && echo $CMD
eval $CMD

Хитрость заключается в том, чтобы сохранить команду как переменную, а затем распечатать переменную, только если вы отлаживаете. Это избавляет от необходимости записывать его дважды, и затем вы можете eval переменную для выполнения содержащейся в ней команды.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .