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