Linux 如何获取shell脚本中使用的命令列表?
我有一个超过1000行的shell脚本,我想检查脚本中使用的所有命令是否都安装在我的Linux操作系统中。 是否有任何工具可以获取shell脚本中使用的Linux命令列表? 或者,我怎样才能写一个小脚本来为我做到这一点Linux 如何获取shell脚本中使用的命令列表?,linux,bash,shell,Linux,Bash,Shell,我有一个超过1000行的shell脚本,我想检查脚本中使用的所有命令是否都安装在我的Linux操作系统中。 是否有任何工具可以获取shell脚本中使用的Linux命令列表? 或者,我怎样才能写一个小脚本来为我做到这一点 脚本在Ubuntu机器上运行成功,它作为C++应用程序的一部分被调用。我们需要在功能有限的Linux运行的设备上运行相同的程序。我已经手动识别了一些脚本运行且在设备操作系统上不存在的命令。在我们尝试安装这些命令之前,我想检查所有其他命令并立即安装所有命令 提前感谢我在过去已经尝试
脚本在Ubuntu机器上运行成功,它作为C++应用程序的一部分被调用。我们需要在功能有限的Linux运行的设备上运行相同的程序。我已经手动识别了一些脚本运行且在设备操作系统上不存在的命令。在我们尝试安装这些命令之前,我想检查所有其他命令并立即安装所有命令
提前感谢我在过去已经尝试过这一点,并且得出的结论是,很难提供适用于所有脚本的解决方案。原因是每个具有复杂命令的脚本在使用shell功能时都有不同的方法。 对于简单的线性脚本,它可能与使用调试模式一样简单。 例如:
bash-xscript.sh2>&1|grep^+|awk'{print$2}'| sort-u
如果脚本有一些决定,那么您可能会使用相同的方法,认为对于“否则”的情况,命令只是用不同的参数仍然是相同的,或者是一些琐碎的(ECHE+EXIT)。
对于一个复杂的脚本,我试图编写一个脚本,在我自己做的地方查找命令。挑战在于创建有助于识别所有使用可能性的表达式,我认为这对于大约80-90%的脚本是可行的,并且输出应该仅用作引用,因为它将包含无效数据(~20%)
下面是一个使用非常简单的方法解析自身的示例脚本(在不同的行上使用单独的命令,第一个单词将是命令):
输出为:
.
/
/g.
awk
cat
sed
sort
tr
<> P>有更多的情况需要考虑(命令替换、别名等),1, 2和3刚刚开始,但是它们仍然覆盖了最复杂脚本的80%。
使用的正则表达式需要调整或扩展,以提高精度和特殊情况
总之,如果您真的需要这样的东西,那么您可以像上面那样编写脚本,但是在您自己验证之前不要信任输出
export PATH=''
添加到脚本的第二行your_script.sh 2>&1>/dev/null | grep'没有这样的文件或目录'| awk'{print$4;}'| grep-v'/'| sort | uniq | sed's/$/'
如果您有一个基于fedora/redhat的系统,
bash
已经用--rpm requires
标志进行了修补
--rpm要求
:生成shell脚本运行所需的文件列表。这意味着-n
,并且受到与编译时错误检查相同的限制命令替换、条件表达式和eval
内置项未被解析,因此可能会丢失一些依赖项
因此,当您运行以下命令时:
$ bash --rpm-requires script.sh
executable(command1)
function(function1)
function(function2)
executable(command2)
function(function3)
这里有一些限制:
$(command)
<(command)
>(command)
command1 && command2 || command3
$HOME/bin/command
但是,使用envsubt
并将其作为
$ bash --rpm-requires <(<script envsubst)
$bash--rpm需要看一看:或者这个:Arek谢谢,它有点帮助,但不完全是我想要的。我需要知道脚本使用的所有命令。我不能一次运行整个脚本,因为它是根据参数逐部分运行的。到目前为止,我们还没有关于参数的所有信息。1000行没有那么长,其中大部分可能是特定于shell的(如if
,while
,等等),或者是重复的(使用不同的参数重复调用同一命令)手动扫描的时间可能比自动扫描的时间要少。最佳选择是:更新脚本以使用自己的函数包装命令执行,然后在此函数中记录命令并传递到命令本身run(){echo“$1”>/tmp/commands;$@;}
或诸如此类。您好,欢迎来到堆栈溢出:)您在谈论哪个脚本?请把它放在上下文中。这可能会找到一些,但可能不是全部:很可能脚本在遇到第一个缺少的命令时就会出错。你是对的,这只对简单的脚本有效,我认为它太简单了。
$HOME/bin/command
$ bash --rpm-requires <(<script envsubst)
while IFS='' read -r app; do
[ "${app%%(*}" == "executable" ] || continue
app="${app#*(}"; app="${app%)}";
if [ "$(type -t "${app}")" != "builtin" ] && \
! [ -x "$(command -v "${app}")" ]
then
echo "${app}: missing application"
fi
done < <(bash --rpm-requires <(<"$0" envsubst) )
bash --rpm-requires <(cat source1 source2 ... <(<script.sh envsubst))