【发布时间】:2011-07-07 08:12:49
【问题描述】:
我想要一个脚本/工具,例如了解 C++(scitools),它为调用的主 bash 脚本提供回溯:
- 其他 bash 脚本
- Python
- Java
- Perl
让我知道发生了什么。
我不需要复杂的图表,一个简单的文本文件就足够了。
什么能让我这样做?
【问题讨论】:
标签: python linux bash scripting
我想要一个脚本/工具,例如了解 C++(scitools),它为调用的主 bash 脚本提供回溯:
让我知道发生了什么。
我不需要复杂的图表,一个简单的文本文件就足够了。
什么能让我这样做?
【问题讨论】:
标签: python linux bash scripting
使用set -x 或使用bash -x 运行脚本将在执行之前打印每一行(但在变量替换之后,这可能很有用,但有时也可能很讨厌):
bash -x myScript.sh
【讨论】:
set -x 而不是+x。添加-v 将打印没有扩展的行。
bash -x的版本,所以没记错。
+x 在任何一种情况下都会关闭xtrace。
您可以使用 strace 来跟踪您的脚本对其他脚本或程序的执行情况。
你必须像这样运行你的脚本:strace -q -f -e execve yourscript.sh。
这将跟踪对其他可执行文件的所有调用。
[root@devel ~]# ./x.sh
x
y
z
[root@devel ~]# cat x.sh
#!/bin/bash
echo x
./y.sh
[root@devel ~]# cat y.sh
#!/bin/bash
echo y
./z.sh
[root@devel ~]# cat z.sh
#!/bin/bash
echo z
[root@devel ~]# strace -q -f -e execve ./x.sh
execve("./x.sh", ["./x.sh"], [/* 28 vars */]) = 0
x
[pid 19781] execve("./y.sh", ["./y.sh"], [/* 28 vars */]) = 0
y
[pid 19782] execve("./z.sh", ["./z.sh"], [/* 28 vars */]) = 0
z
[pid 19781] --- SIGCHLD (Child exited) @ 0 (0) ---
--- SIGCHLD (Child exited) @ 0 (0) —
它甚至会跟踪对 perl 或其他可执行文件的调用。
[root@devel ~]# cat x.sh
#!/bin/bash
echo x
./y.sh
ls >/dev/null 2>&1
[root@devel ~]# cat y.sh
#!/bin/bash
echo y
perl -e 'print "z\n";'
[root@devel ~]# ./x.sh
x
y
z
[root@devel ~]# strace -q -f -e execve ./x.sh
execve("./x.sh", ["./x.sh"], [/* 28 vars */]) = 0
x
[pid 20300] execve("./y.sh", ["./y.sh"], [/* 28 vars */]) = 0
y
[pid 20301] execve("/usr/bin/perl", ["perl", "-e", "print \"z\\n\";"], [/* 28 vars */]) = 0
z
[pid 20300] --- SIGCHLD (Child exited) @ 0 (0) ---
--- SIGCHLD (Child exited) @ 0 (0) ---
[pid 20302] execve("/bin/ls", ["ls"], [/* 28 vars */]) = 0
--- SIGCHLD (Child exited) @ 0 (0) ---
[root@devel ~]#
【讨论】:
如果您只需要 bash 脚本调用日志,请使用此应用 https://github.com/lvitya/bash_wrapper
bash_wrapper 替换 bash 本身,记录调用 bash_wrapper 并执行原始 bash 的日志。也就是说,它独立于 -x 选项处理嵌套的 bash 调用。
您可以修改源代码以获得使用GraphViz的点格式的调用图。
【讨论】: