Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 如何获取shell脚本中使用的命令列表?_Linux_Bash_Shell - Fatal编程技术网

Linux 如何获取shell脚本中使用的命令列表?

Linux 如何获取shell脚本中使用的命令列表?,linux,bash,shell,Linux,Bash,Shell,我有一个超过1000行的shell脚本,我想检查脚本中使用的所有命令是否都安装在我的Linux操作系统中。 是否有任何工具可以获取shell脚本中使用的Linux命令列表? 或者,我怎样才能写一个小脚本来为我做到这一点 脚本在Ubuntu机器上运行成功,它作为C++应用程序的一部分被调用。我们需要在功能有限的Linux运行的设备上运行相同的程序。我已经手动识别了一些脚本运行且在设备操作系统上不存在的命令。在我们尝试安装这些命令之前,我想检查所有其他命令并立即安装所有命令 提前感谢我在过去已经尝试

我有一个超过1000行的shell脚本,我想检查脚本中使用的所有命令是否都安装在我的Linux操作系统中。 是否有任何工具可以获取shell脚本中使用的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
    
  • 不列出包含shell变量的命令。这通常是有道理的,因为 有些可能是某些脚本逻辑的结果,但甚至忽略以下内容

    $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))