确定shell脚本将执行的所有命令的最佳方法是什么?

确定shell脚本将执行的所有命令的最佳方法是什么?,shell,parsing,sh,Shell,Parsing,Sh,我希望能够解析shell脚本并返回它可能执行的命令集(不包括shell关键字,如if和for),包括管道提供的所有命令和backticks中包含的所有命令 什么是解决这个问题的合适方法?我在考虑正则表达式,但这可能不够。但我不知道足够的解析理论来正确地理解这一点 编辑:感谢到目前为止的回复。我知道在确定这一点时,外部输入将是一个问题。如果我们将其从分析中排除,在这种情况下这是合理的任务吗?你不能,或者换一种说法:每个命令都可能被执行 下面是一个示例脚本 $(cat somerandomfile)

我希望能够解析shell脚本并返回它可能执行的命令集(不包括shell关键字,如
if
for
),包括管道提供的所有命令和backticks中包含的所有命令

什么是解决这个问题的合适方法?我在考虑正则表达式,但这可能不够。但我不知道足够的解析理论来正确地理解这一点


编辑:感谢到目前为止的回复。我知道在确定这一点时,外部输入将是一个问题。如果我们将其从分析中排除,在这种情况下这是合理的任务吗?

你不能,或者换一种说法:每个命令都可能被执行

下面是一个示例脚本

$(cat somerandomfile)

它能做什么?答案取决于
somerandomfile
中的内容。要确定可能执行的命令集,您必须评估整个环境(它基本上随每个时钟滴答而变化)。

假设您有一个程序X,它回答了shell脚本Y使用命令Z的问题。然后我们可以构造执行任何程序的shell脚本Y',完成后调用命令Z。所以,您所要求的假设程序X,解决了不可判定的问题。

这是一种停止问题。这是不可确定的。老实说,这不是一个直截了当的taskShell没有一个
--dry run
之类的选项。那么可能不是一个确定的列表,而是基于可以从脚本中解析出的内容的有限估计?并且忽略外部输入。也许跟踪运行shell可以解决您的问题,像
sh-x script.sh
那样运行它。我不确定这是否等同于停止问题,因为我只想知道脚本是否可以执行命令Z,而不是它是否真的会执行命令Z。因此,等于“if false;then Z;fi”的脚本Y将返回“Z”。