列出 shell 脚本使用的所有程序

列出 shell 脚本使用的所有程序

我试图找出一种方法来列出脚本运行时将使用的所有程序,而无需实际运行它。

我写了这些快速而肮脏的俏皮话:

# fill an array with all the useful words except variables, options, brackets, quotes
readarray -t list <<<$( grep -v '^#' script.sh | sed 's/[0-9a-zA-Z_\-]*=//g ; s/\${.*}//g ; s/\$(//g ; s/[)'\"\'\`']//g ; s/ --*.//g ' )

# for every word in array show info with `type' and clean the output again
for p in "${list[@]}" ; do type "${p}" ; done 2>&1 | grep -v -e '^bash:' -e 'shell keyword' -e 'shell builtin' | sort | uniq | sed 's/^.* //g ; s/[\(\)]//g'

我认为存在的问题是:

  1. 如果未安装该程序,“输入”将失败
  2. 这里的文档可以包含关键字,也可以是程序......
  3. 如果脚本写得不好,难度可能会增加(“shellcheck”可能很有用)
  4. 不跟踪外部配置文件和函数库(参见 ilkkachu 评论)

有更好的解决办法吗?

答案1

在帖子 #16 中https://www.unix.com/shell-programming-and-scripting/268856-how-pre-check-scrutinize-all-my-shell-scripts.html我发布了一个150行的perl脚本p1.txt这可能是一个有用的起点。我还添加了一个链接一个更完整、更复杂的 shell 解析器

最好查看整个线程——也许其他一些观点也可能令人感兴趣。

最美好的祝愿...干杯,drl

答案2

这不是一件容易的事。您已经发现了其中的几个困难。基于文本的解析非常容易出错,很容易绕过(如果有人愿意的话)并且几乎肯定是不完整的。

Bash 有一个“set”内置函数,可以解析脚本而不实际执行它。这可能会对您有所帮助,但即使如此也是有限的。

  [set] -n      Read commands but do not execute them.  This may be used
                  to  check  a  shell  script  for syntax errors.  This is
                  ignored by interactive shells.

要在脚本上测试它,只需set -n在脚本的开头添加,然后运行它。

strace将非常有用,但需要脚本实际运行,这是您在确信脚本安全后要做的事情。

相关内容