自动逐行运行脚本,但从第二行开始在每一行之前都会被询问

自动逐行运行脚本,但从第二行开始在每一行之前都会被询问

我正在编写一个大约 20 行的脚本,我发现自己通过复制粘贴和逐行执行来一次又一次地进行测试。

Enter我不想复制粘贴每一行并点击执行复制粘贴整个脚本无需一次性执行(作为一个块或一个此处文档),而是像时尚这样的查询;例如:

  • 第一行 get 定期(无条件)执行,并且询问我是否希望继续执行即将到来的行(在有足够的时间考虑输出之后);

  • 如果我选择继续——那就这样吧,如果不继续,操作就会中断;

  • (到目前为止的结果当然不会回滚,但我至少不会继续产生进一步有问题的结果);

应逐行重复此模式,直到脚本结束。

有没有一个实用程序可以帮助我以这种方式工作?

答案1

你可以使用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

prompt设置陷阱后,这将在每个命令之前运行该函数,让您可以选择继续或中止。以 开头的行将echo Hello被替换为您的脚本,或者更好的是,您可以将函数和trap命令存储在单独的 scriptlet 中,并将其放在source要调试的脚本内。

陷阱有一些微妙之处DEBUG;其一,它不会触发内部函数,除非它已在函数内部重新设置(因此您可以跳过不想调试的函数,包括函数prompt本身,但您需要记住在trap您要调试的函数内部运行)想要调试)。

可以在脚本中随意启用和禁用跟踪行为,分别通过添加

trap prompt DEBUG

trap "" DEBUG

作为适当的。

相关内容