Answers:
您无需在每一行中都进行读取,只需在bash脚本中添加如下所示的陷阱即可,例如,它具有您想要的效果。
#!/usr/bin/env bash
set -x
trap read debug
< YOUR CODE HERE >
可行,刚刚使用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中杀死它。
替代方案1
如果您只想等待几秒钟,然后再继续执行脚本中的下一个命令,则以下示例可能对您有用。
#!/usr/bin/env bash
trap "set +x; sleep 5; set -x" DEBUG
< YOUR CODE HERE >
我在trap命令中添加了set + x和set -x,以使输出更具可读性。
trap 'read -u1' debug
以覆盖文件读取重定向问题。
也许BASH调试器适合您。
apt-get install bashdb
。然后,您只需要运行bashdb your_command.sh
,键入step
,然后在那之后按回车键即可。
brew install bashdb
如果您的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
它允许步进xtrace。