我正在寻找一种处理shell脚本的方法来确定:
它不需要通过依赖项递归,只需列出它直接运行的内容.我本可以写一些自己这样做的东西,但它必须在之前完成......我只是没找到它.
您可以使用'strace'来运行脚本并查看脚本及其子进程所执行的所有操作,包括查找和打开文件.例如:
$ cat foo.sh
#!/usr/bin/env bash
touch /tmp/foon
$ chmod +x foo.sh
$ strace -f -e execve,access,open,stat -o foo.trace ./foo.sh
$ cat foo.trace
32176 execve("./foo.sh", ["./foo.sh"], [/* 42 vars */]) = 0
32176 access("/etc/ld.so.nohwcap", F_OK) = -1 ENOENT (No such file or directory)
32176 access("/etc/ld.so.preload", R_OK) = -1 ENOENT (No such file or directory)
32176 open("/usr/local/lib/tls/x86_64/libc.so.6", O_RDONLY) = -1 ENOENT (No such file or directory)
...
32176 execve("/bin/bash", ["bash", "./foo.sh"], [/* 42 vars */]) = 0
...
32177 execve("/usr/bin/touch", ["touch", "/tmp/foon"], [/* 41 vars */]) = 0
32177 open("/tmp/foon", O_WRONLY|O_CREAT|O_NOCTTY|O_NONBLOCK, 0666) = 3
...
32176 --- SIGCHLD (Child exited) @ 0 (0) ---
$
Run Code Online (Sandbox Code Playgroud)
我已经修剪了很多其他活动(打开系统库;查找区域设置数据;等等).查看'man strace',了解选项的含义细节; -f,-o和-e是我经常使用的那些.
这将是我目前开发的Loker项目的一个功能。目前,解析器已基本完成,您可以在其之上实现您想要的合理近似。然而,一般来说这个任务非常复杂,因为命令的名称可能是由变量扩展、字段分割等产生的。
如果你描述一下你需要这个做什么以及你要解析什么样的脚本,我就能说 Loker 现在可以满足你的多少需求。
作为替代选项,某些版本的 bash 有--rpm-requires选项,它也执行类似的操作。