如果我输入bash -x选项,它将显示所有行。但是脚本会正常执行。
我如何逐行执行?我可以看到它是否做了正确的事情,或者我中止并修复了这个bug。同样的效果是每行read
。
答案 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)
它允许踩踏xtrace。
答案 4 :(得分:0)
xargs:可以过滤行
cat .bashrc | xargs -0 -l -d \\n bash