如何逐行执行bash脚本?

时间:2012-01-31 13:38:29

标签: bash

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

我如何逐行执行?我可以看到它是否做了正确的事情,或者我中止并修复了这个bug。同样的效果是每行read

5 个答案:

答案 0 :(得分:107)

你不需要在每行中添加一个读取,只需在你的bash脚本中添加如下的陷阱,它就会产生你想要的效果,例如。

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

< YOUR CODE HERE >

Works,只是使用bash v4.2.8和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 >

要停止脚本,在这种情况下你必须从另一个shell中杀死它


<强> ALTERNATIVE1

如果您只想等待几秒钟,然后再继续执行脚本中的下一个命令,则以下示例可能对您有用。

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

< YOUR CODE HERE >

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

答案 1 :(得分:13)

也许BASH Debugger适合你。

答案 2 :(得分:1)

如果你的bash脚本实际上是一堆一个你想要逐个运行的命令,你可以这样做,当你增加一个变量LN时,它会逐个运行每个命令,相应的到您要运行的行号。这使您可以再次运行最后一个命令,然后只需增加变量即可转到下一个命令。

假设您的命令位于文件&#34; it.sh&#34;中,请逐个运行以下命令。

$ 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

答案 3 :(得分:0)

查看bash-stepping-xtrace

它允许踩踏xtrace。

答案 4 :(得分:0)

xargs:可以过滤行

cat .bashrc | xargs -0 -l -d \\n bash
  • -0视为原始输入(无转义)
  • -l分隔每一行(默认情况下不是演出)
  • -d \\ n行分隔符