如何逐行执行脚本以进行故障排除?

如何逐行执行脚本以进行故障排除?

有没有办法做到这一点,或者有更好的方法?

我的脚本中有一个逻辑错误,我想逐行执行它,在每行之后暂停,以便在执行下一行之前查看发生了什么(检查变量、查看文件等)。我在很多行之后都放置了echo var = $varcat file语句,但这很令人困惑,我想一定有更好的方法。(顺便说一句,我不是在寻找要运行的程序,而是想用命令来做)

答案1

来自 Stack Overflow:

set -x或者set -o xtrace扩展变量并在行前打印一个小 + 号。

set -v或者set -o verbose在打印之前不扩展变量。

使用set +xset +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

如果我理解了你的问题,我正在考虑两个非常简单和替代的解决方案:

  1. 在终端上输入脚本 shell 的名称(例如 csh。我不知道)。它将出现提示,让您逐行插入指令(因此只需从脚本中复制它们并将其粘贴到终端上)。这样,您就可以看到每个步骤中发生的事情。

或者

  1. 修改脚本,在产生意外错误的“关键”行之前插入命令“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 行之前的计算结果。

相关内容