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

6 security shell-script exit testing control-flow

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

与其复制粘贴每一行并点击Enter执行,我想复制粘贴整个脚本而不是一次性执行它(作为一个块或一个heredocument),而是以一种查询方式;例如:

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

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

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

这种模式应该一行一行地重复,直到脚本结束。

是否有实用程序可以帮助我以这种方式工作?

Ste*_*itt 8

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

作为适当的。