![如何逐行执行脚本以进行故障排除?](https://linux22.com/image/1069773/%E5%A6%82%E4%BD%95%E9%80%90%E8%A1%8C%E6%89%A7%E8%A1%8C%E8%84%9A%E6%9C%AC%E4%BB%A5%E8%BF%9B%E8%A1%8C%E6%95%85%E9%9A%9C%E6%8E%92%E9%99%A4%EF%BC%9F.png)
有没有办法做到这一点,或者有更好的方法?
我的脚本中有一个逻辑错误,我想逐行执行它,在每行之后暂停,以便在执行下一行之前查看发生了什么(检查变量、查看文件等)。我在很多行之后都放置了echo var = $var
和cat file
语句,但这很令人困惑,我想一定有更好的方法。(顺便说一句,我不是在寻找要运行的程序,而是想用命令来做)
答案1
来自 Stack Overflow:
set -x
或者set -o xtrace
扩展变量并在行前打印一个小 + 号。
set -v
或者set -o verbose
在打印之前不扩展变量。
使用set +x
和set +v
关闭上述设置。
在脚本的第一行,可以放置#!/bin/sh -x
(或) 来达到与脚本后面的(或)-v
相同的效果。set -x
-v
以上内容也适用于/bin/sh
。
请参阅 bash-hackers 的维基set
属性等等调试。
$ cat shl
#!/bin/bash
DIR=/tmp/so
ls $DIR
$ bash -x shl
+ DIR=/tmp/so
+ ls /tmp/so
$
答案2
如果我理解了你的问题,我正在考虑两个非常简单和替代的解决方案:
- 在终端上输入脚本 shell 的名称(例如 csh。我不知道)。它将出现提示,让您逐行插入指令(因此只需从脚本中复制它们并将其粘贴到终端上)。这样,您就可以看到每个步骤中发生的事情。
或者
修改脚本,在产生意外错误的“关键”行之前插入命令“sleep”(后跟以秒为单位的时间间隔)。它适用于 csh 和 sh。例如:
#this is a script #!/bin/sh line 1 line 2 sleep 200 #it means 200 seconds of pausing before next istruction line 3 etc..
在这个例子中,你可以在工作目录中看到执行第 2 行之后但执行第 3 行之前的计算结果。