【问题标题】:How to find bash commands?如何找到 bash 命令?
【发布时间】:2012-09-13 08:41:24
【问题描述】:

我想这很简单。 我只想找到一个 bash 命令。例如,当我想知道存在哪些命令时,包含短语“user”。

所以我正在寻找的命令应该打印我所有包含用户的命令的位置,或者它可以告诉我哪些命令与名称一起存在。不过这样就好了。

我在so和google上搜索过这里,但是他们都只是谈论“find”命令。

【问题讨论】:

  • 这类问题属于SuperUser
  • 您是在谈论实际的 bash 命令(内置),可以用 bash 执行的可执行程序,相同但仅限于 $PATH 中的那些,上述的某种组合或其他?
  • 不,不仅限于我的 $Path。顺便说一句,Sampo,这是我的第一个问题。我阅读了 StackOverflow 的常见问题解答,它说在这里我们可以谈论/询问编程问题。这个是关于 bash 编程的。

标签: linux bash find command


【解决方案1】:

PATH 中包含“用户”的可执行文件或符号链接列表:

find $(echo $PATH | tr ':' ' ') -maxdepth 1 \( -type f -or -type l \) -name '*user*' -executable

样本输出:

/usr/bin/users
/usr/bin/xdg-user-dir
/usr/bin/xdg-user-dirs-gtk-update
/usr/bin/users-admin
/usr/bin/xdg-user-dirs-update
/bin/fuser
/bin/fusermount
/bin/ntfs-3g.usermap
/usr/sbin/deluser
/usr/sbin/adduser
/usr/sbin/useradd
/usr/sbin/userdel
/usr/sbin/usermod
/usr/sbin/newusers

也比 wormsparty 的变体快很多(无意冒犯:P)。结果几乎相同(他也返回目录,AFAIK)

【讨论】:

    【解决方案2】:
    compgen -c | grep -i "user"
    

    compgen [选项] [单词]

    根据选项为word生成可能的补全匹配,可以是除了-p和-r之外的complete内置的任何选项,并将匹配写入标准输出。

    匹配的生成方式与可编程完成代码直接从具有相同标志的完成规范生成它们的方式相同。如果指定了 word,则只显示匹配 word 的那些补全。

    ...

    -A 动作 该动作可以是以下之一,以生成可能完成的列表:

    alias 别名。也可以指定为 -a。

    arrayvar 数组变量名。

    绑定 Readline 键绑定名称(请参阅可绑定的 Readline 命令)。

    builtin shell 内置命令的名称。也可以指定为 -b。

    command 命令名称。也可以指定为 -c。

    directory 目录名称。也可以指定为 -d。

    disabled 禁用的 shell 内置函数的名称。

    enabled 已启用的 shell 内置函数的名称。

    export 导出的 shell 变量的名称。也可以指定为 -e。

    file 文件名。也可以指定为 -f。

    function shell 函数的名称。

    group 组名。也可以指定为 -g。

    helptopic 内置 help 接受的帮助主题(请参阅 Bash Builtins)。

    hostname 主机名,取自 HOSTFILE shell 变量指定的文件(请参阅 Bash 变量)。

    作业 作业名称,如果作业控制处于活动状态。也可以指定为 -j。

    keyword Shell 保留字。也可以指定为 -k。

    running 正在运行的作业的名称,如果作业控制处于活动状态。

    service 服务名称。也可以指定为 -s。

    setopt set builtin 的 -o 选项的有效参数(请参阅 Set Builtin)。

    shopt 内置命令接受的 shopt Shell 选项名称(请参阅 Bash 内置命令)。

    信号 信号名称。

    stopped 已停止作业的名称,如果作业控制处于活动状态。

    user 用户名。也可以指定为 -u。

    变量所有shell变量的名称。也可以指定为 -v。

    【讨论】:

      【解决方案3】:

      您可能想检查某些路径中的空格并使用更强大的正则表达式对其进行改进,但这可以解决问题:

      #!/bin/sh
      
      if [ $# -ne 1 ]; then
         echo "Usage: $0 pattern"
          exit 1
      fi
      
      for x in `echo "${PATH}" | sed 's/:/ /g'`; do
          for y in $x/*; do
              if [ -x "$y" ]; then
                  if [ `echo "$y" | grep $1 | wc -l` -ne 0 ]; then
                      echo "$y"
                  fi
              fi
          done
      done
      

      【讨论】:

        【解决方案4】:

        如果要查找目录中的所有命令,在 Linux 上可以使用:

        find /bin -type f -perm -o+x  -name '*z*'
        

        在此示例中,它将列出 /bin 目录中名称中包含 z 的所有可执行文件(程序)。如果要在多个目录中搜索,可以编写脚本并循环调用 find,每个目录一次。

        您可以将此与之前的答案结合起来,在您的路径上的所有目录中进行搜索:

        find $(echo $PATH | tr ':' ' ') -type f -perm -o=x  -name '*z*'
        

        【讨论】:

        • /bin 的子目录不在 PATH 中。你不会找到这样的符号链接。例如,我有/usr/bin/dropuser -> ../share/postgresql-common/pg_wrapper。另外,不需要循环,请参阅我的答案。
        猜你喜欢
        • 2016-09-02
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 2020-03-11
        • 2013-03-01
        • 2016-03-24
        • 2018-05-28
        相关资源
        最近更新 更多