Есть ли способ запуска сценария оболочки с выводом команд, но без их фактического выполнения?
Допустим, у меня есть скрипт, удаляющий файл, имя которого хранится в переменной:
#!/bin/bash
set -v
FN="filename"
rm -f ${FN}
Добавление set -v
будет повторять следующие команды перед выполнением:
$ ./scr.sh
FN="filename"
rm -f ${FN}
Теперь я хочу увидеть поток этого скрипта без фактического удаления файла. Я хочу предотвратить любое влияние на внешнюю среду и файловую систему. Это возможно?
Я мог бы обернуть все команды с помощью echo
команды, но это утомительно для длинного сценария.
linux
bash
shell-script
ysap
источник
источник
Ответы:
Нет способа пройтись по сценарию, чтобы увидеть, как он будет выполняться без этого. В вашем примере нет
if
операторов или циклов. Но в реальных сценариях часто встречается много условных операторов. Какая ветвь будет получена, часто зависит от того, что произошло, когда оболочка выполнила предыдущую команду. Если она не запускает команду, оболочка не может узнать, какой вывод она сгенерировала или какой код возврата был бы, от чего могла бы зависеть следующая условная ветвь или оператор присваивания.Если дело в том, что вы хотите изучить скрипт и знать, что он делает, прежде чем запускать его, это неплохая идея. Но на самом деле, лучший способ сделать это - просто просмотреть файл с помощью
less
илиvi
или что-то подобное.добавленной
Если вы разрабатываете сценарий и хотите в первый раз пройтись по нему, тестируя логику, но на самом деле не причиняя вреда, если у вас есть ошибка, решение, которое я часто могу использовать, заключается в изменении только заявления, которые могут нанести какой-либо ущерб, вставив
echo
на фронт.Это часто работает в типичных реальных сценариях, потому что (а) генерирование списков элементов, по которым вы будете выполнять итерацию, или значение, для которого вы устанавливаете переменную, часто можно генерировать без изменения файловой системы, и (б) обычно достаточно Предположим, что если вы запустили команду, она будет успешной.
источник
trap read debug
которого будет выполняться чтение после каждой выполненной строки, а затем можно медленно выполнить его, нажав клавишу ввода (это полезно, если у вас очень длинный сценарий и вы хотите проверить это в первый раз).Я думаю, что вам придется повторить - однако, если вы поместите команду в переменную, вы можете включить и выключить ее. Кроме того, команда может быть функцией и настолько сложной, насколько вы хотите.
источник
D=eval
в живой части. Но хороший ответ!Вы отслеживаете поток, используя опцию -x для bash, но это все равно будет выполнять команды.
Лучшее, что вы можете сделать, это просто поставить echo или закомментировать команды, которые имеют внешние эффекты, такие как rm. По крайней мере, вам не нужно менять каждую строку.
источник
Я не знаю какого-либо конкретного метода для пробного запуска, но мы можем использовать некоторые меры предосторожности для понимания неизвестного сценария.
bash -n <script>
для проверки синтаксиса . Из руководства gnu bash https://www.gnu.org/software/bash/manual/html_node/The-Set-Builtin.html-n Read commands but do not execute them; this may be used to check a script for syntax errors. This option is ignored by interactive shells.
alias rm="rm -i" alias cp="cp -i" alias mv="mv -i"
Для потоковых редакторов, таких как sedsed -i
(-i изменяет файл на месте без -i, он выполняет пробный запуск для sed, проверьте страницу man для получения подробной информации). можно скопировать полную команду и запустить. Непосредственно перед самой командой будет отображаться вывод на экране, а затем используется команда для ожидания продолжения ввода пользователя. Примерsed -i <pattern>
Заменить наsed <pattern> read -p "Press any key..." sed -i <pattern>
Также всегда рекомендуется сохранять резервные точки в вашей системе, чтобы в случае чрезвычайной ситуации данные можно было восстановить.
источник
Сделайте
set –n
или добавьтеn
к своей существующейset –v
команде. Но так как это заставляет оболочку не оценивать какие-либо команды, даже неif
илиwhile
, вы можете не получить слишком хорошего представления о рабочем процессе.источник
Вот небольшая конструкция, которую я люблю использовать:
источник
Если вы хотите предотвратить изменения, вы можете запустить скрипт как пользователь без привилегий:
В вашем примере это будет выполнено
FN="filename"
как обычно. Хотя она технически выполняет и эту командуrm -f ${FN}
, ничего не произойдет, если никто не имеет необходимых прав для удаления файла.Конечно, это вызовет проблемы с условным рабочим процессом. Тот факт, что
rm
команда не выполнена, может повлиять на дальнейшие части сценария.источник