列出 shell 知道的所有命令

列出 shell 知道的所有命令

我可以在 shell(恰好是bash)中输入什么来列出所有可识别的命令?

另外,这因外壳而异吗?或者所有 shell 都只有一个它们识别的命令“目录”?

其次,不同的问题,但我怎样才能覆盖其中任何一个?换句话说,我如何编写自己的view命令来替换 Ubuntu 系统上现有的命令,该命令似乎只是加载vim.

答案1

您可以使用compgen

compgen -c # will list all the commands you could run.

供参考:

compgen -a # will list all the aliases you could run.
compgen -b # will list all the built-ins you could run.
compgen -k # will list all the keywords you could run.
compgen -A function # will list all the functions you could run.
compgen -A function -abck # will list all the above in one go.

答案2

shell 知道四种命令。

  • 别名:这些是带有某些选项的命令的昵称。它们在 shell 的初始化文件(对于 bash)中定义~/.bashrc
  • 函数:它们是具有名称的 shell 代码片段。与别名一样,它们是在 shell 的初始化文件中定义的。
  • 内置命令:shell 带有少量内置命令。大多数内置命令都会操纵 shell 状态(cd更改当前目录、set更改选项和位置参数、export更改环境等)。大多数 shell 都提供基本相同的内置函数,但每个 shell 对基本集都有一些扩展。
  • 外部命令:它们独立于 shell。与其他程序一样,shell 通过在可执行搜索路径。环境PATH变量包含一个以冒号分隔的目录列表,用于搜索程序。

如果存在多种同名命令,则执行上述顺序中的第一个匹配项。

您可以通过运行来查看名称对应的命令类型type some_name

您可以通过运行alias不带参数的内置函数来列出别名。无法列出适用于所有 shell 的函数或内置函数。您可以在 shell 的文档中找到内置命令的列表。

在 bash 中,set内置函数列出了函数及其定义和变量。在 bash、ksh 或 zsh 中,typeset -f列出函数及其定义。在 bash 中,您可以列出任何类型的所有命令名称compgen -c。您可以使用compgen -A alias,compgen -A builtin compgen -A function列出特定类型的命令。您可以传递一个附加字符串来compgen仅列出以该前缀开头的命令。

echo ${(k)aliases}在 zsh 中,您可以使用、echo ${(k)functions}和列出给定类型的当前可用命令echo ${(k)builtins}echo ${(k)commands}最后一个仅列出外部命令)。

以下与 shell 无关的代码片段列出了所有可用的外部程序:

case "$PATH" in
  (*[!:]:) PATH="$PATH:" ;;
esac

set -f; IFS=:
for dir in $PATH; do
  set +f
  [ -z "$dir" ] && dir="."
  for file in "$dir"/*; do
    if [ -x "$file" ] && ! [ -d "$file" ]; then
      printf '%s = %s\n' "${file##*/}" "$file"
    fi
  done
done

Bash 中有一个边缘情况:散列命令。

Bash 参考手册说:

仅当在哈希表中未找到该命令时,才会对 $PATH 中的目录执行完整搜索

尝试:

set -h
mkdir ~/dir-for-wat-command
echo 'echo WAT!' >~/dir-for-wat-command/wat
chmod +x ~/dir-for-wat-command/wat
hash -p ~/dir-for-wat-command/wat wat
wat

环境PATH变量不包含~/dir-for-wat-commandcompgen -c不显示wat,但可以运行wat

如果您想隐藏现有命令,定义别名或函数

¹例外:一些内置函数(称为特殊的内置函数) 不能被函数遮盖——尽管 bash 和 zsh 在默认模式下在这一点上不符合 POSIX。

答案3

尝试这个,使用:

(   # usage of a sub processus: the modificaion of PATH variable is local in ( )
    PATH+=:EOF # little hack to list last PATH dir
    printf '%s\n' ${PATH//:/\/* }
)

答案4

如果按两次 Tab 键,然后按 y,您将获得当前 shell 中所有可用命令的列表。对于第二个问题,我认为你应该使用别名:外壳别名

相关内容