我可以在 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 中有一个边缘情况:散列命令。
仅当在哈希表中未找到该命令时,才会对 $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-command
,compgen -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 中所有可用命令的列表。对于第二个问题,我认为你应该使用别名:外壳别名。