6 security shell-script exit testing control-flow
我编写了一个大约 20 行的脚本,我发现自己通过复制粘贴和逐行执行一次又一次地测试。
与其复制粘贴每一行并点击Enter执行,我想复制粘贴整个脚本而不是一次性执行它(作为一个块或一个heredocument),而是以一种查询方式;例如:
第一行 get 定期(无条件)执行,我被询问是否希望继续执行即将到来的行(在有足够的时间考虑输出之后);
如果我选择继续——就这样吧,否则,操作就会中断;
(到目前为止的结果当然不会回滚,但我至少不会继续产生进一步有问题的结果);
这种模式应该一行一行地重复,直到脚本结束。
是否有实用程序可以帮助我以这种方式工作?
您可以使用Bash 调试器来调试您的脚本。
一个更简单的选择是使用DEBUG陷阱:
#!/bin/bash
function prompt {
if [[ -n "$BASH_COMMAND" ]]; then
echo About to run \'$BASH_COMMAND\'
read -p 'Continue [Y/n]?' CONT
if [[ "$CONT" = "n" || "$CONT" = "N" ]]; then
echo Exiting prematurely
exit 1
fi
fi
}
trap prompt DEBUG
echo Hello
ls
sleep 10
Run Code Online (Sandbox Code Playgroud)
prompt一旦设置了陷阱,这将在每个命令之前运行该函数,为您提供继续或中止的选项。开头的echo Hello行将被替换为您的脚本,或者更好的是,您可以将函数和trap命令存储在source要调试的脚本中的单独 scriptlet 中。
DEBUG陷阱有一些微妙之处;一方面,它不会在函数内部触发,除非它已在函数内部重新设置(因此您可以跳过不想调试的prompt函数,包括函数本身,但您需要记住trap在函数内部运行确实想调试)。
跟踪行为可以在您的脚本中随意启用和禁用,分别通过添加
trap prompt DEBUG
Run Code Online (Sandbox Code Playgroud)
和
trap "" DEBUG
Run Code Online (Sandbox Code Playgroud)
作为适当的。