如何逐行执行 bash 脚本?

如果我输入 bash -x选项,它将显示所有的行。但脚本将正常执行。

如何逐行执行?比我能看到它是否做正确的事情,或者我中止和修复错误。同样的效果是在每一行都放一个 read

101717 次浏览

The BASH 调试器项目 is "a source-code debugger for bash that follows the gdb command syntax."

You don't need to put a read in everyline, just add a trap like the following into your bash script, it has the effect you want, eg.

#!/usr/bin/env bash
set -x
trap read debug


< YOUR CODE HERE >

Works, just tested it with bash v4.2.8 and v3.2.25.


改良版

如果您的脚本正在从文件中读取内容,上面列出的内容将不起作用。变通方法可能类似于下面的示例。

#!/usr/bin/env bash
echo "Press CTRL+C to proceed."
trap "pkill -f 'sleep 1h'" INT
trap "set +x ; sleep 1h ; set -x" DEBUG


< YOUR CODE HERE >

要停止脚本,在这种情况下必须使用 用另一个壳杀死它


备选方案1

如果您只是想等待几秒钟,然后再继续执行脚本中的下一个命令,那么下面的示例可能适合您。

#!/usr/bin/env bash
trap "set +x; sleep 5; set -x" DEBUG


< YOUR CODE HERE >

我将在 trap 命令中添加 set + x 和 set-x,以使输出更具可读性。

看看 Bash-step-xtrace

它允许单步 xtrace。

如果 bash 脚本实际上是一堆想要一个一个运行的关闭命令,那么可以这样做,当您递增一个变量 LN(与您想要运行的行号对应)时,它会一个一个地运行每个命令。这使您可以非常容易地再次运行最后一个命令,然后只需增加变量即可转到下一个命令。

假设您的命令位于文件“ it.sh”中,逐个运行以下命令。

$ cat it.sh
echo "hi there"
date
ls -la /etc/passwd


$ $(LN=1 && cat it.sh | head -n$LN | tail -n1)
"hi there"


$ $(LN=2 && cat it.sh | head -n$LN | tail -n1)
Wed Feb 28 10:58:52 AST 2018


$ $(LN=3 && cat it.sh | head -n$LN | tail -n1)
-rw-r--r-- 1 root wheel 6774 Oct 2 21:29 /etc/passwd

Xargs: 可以过滤行

cat .bashrc | xargs -0 -l -d \\n bash
  • -0将其视为原始输入(无转义)
  • - 分开每一行(表演时不预设)
  • 分隔线