如果我输入 bash -x选项,它将显示所有的行。但脚本将正常执行。
如何逐行执行?比我能看到它是否做正确的事情,或者我中止和修复错误。同样的效果是在每一行都放一个 read。
read
The BASH 调试器项目 is "a source-code debugger for bash that follows the gdb command syntax."
You don't need to put a read in everyline, just add a trap like the following into your bash script, it has the effect you want, eg.
#!/usr/bin/env bash set -x trap read debug < YOUR CODE HERE >
Works, just tested it with bash v4.2.8 and 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 >
要停止脚本,在这种情况下必须使用 用另一个壳杀死它。
备选方案1
如果您只是想等待几秒钟,然后再继续执行脚本中的下一个命令,那么下面的示例可能适合您。
#!/usr/bin/env bash trap "set +x; sleep 5; set -x" DEBUG < YOUR CODE HERE >
我将在 trap 命令中添加 set + x 和 set-x,以使输出更具可读性。
看看 Bash-step-xtrace。
它允许单步 xtrace。
如果 bash 脚本实际上是一堆想要一个一个运行的关闭命令,那么可以这样做,当您递增一个变量 LN(与您想要运行的行号对应)时,它会一个一个地运行每个命令。这使您可以非常容易地再次运行最后一个命令,然后只需增加变量即可转到下一个命令。
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
Xargs: 可以过滤行
cat .bashrc | xargs -0 -l -d \\n bash