在Linux系统中,要显示所有可用命令,可以通过多种方式实现,具体取决于用户的需求——是查看系统内置命令、已安装的可执行程序,还是特定环境下的命令列表,以下从基础命令、系统路径查询、组合过滤技巧及工具辅助等角度,详细展开说明如何全面获取Linux命令信息。

基础命令:查看内置命令与可执行程序
Linux命令分为两类:内置命令(Shell自带的命令,如cd、echo)和外部命令(独立的可执行程序,如ls、grep),通过不同命令可分别查看这两类命令。
查看所有内置命令:compgen -b
内置命令是Shell的核心功能,直接由Shell进程执行,无需调用外部程序,使用compgen命令(Bash内置的命令补全工具)可快速列出所有内置命令:
compgen -b
输出结果包含if、then、while、for、cd、echo、export等常用内置命令,这些命令无法通过which或whereis查到路径,因为它们不是独立的可执行文件。
查看所有外部命令:遍历$PATH环境变量
外部命令存储在系统目录中,其路径由$PATH环境变量指定(如/bin、/usr/bin、/usr/local/bin等),要查看所有外部命令,可遍历$PATH中的目录并列出其中的可执行文件:

echo $PATH | tr ':' '\n' | xargs -I {} ls {} | grep -v '^/' | sort -u
该命令的逻辑是:
echo $PATH:输出$PATH变量(如/usr/local/bin:/usr/bin:/bin);tr ':' '\n':将路径分隔符换行为换行符,得到每行一个路径;xargs -I {} ls {}:对每个路径执行ls命令,列出目录内容;grep -v '^/':过滤掉子目录(以开头的行,如/usr/bin/subdir/);sort -u:排序并去重,最终得到所有外部命令列表。
若需查看命令路径,可结合which或whereis,
echo $PATH | tr ':' '\n' | xargs -I {} find {} -maxdepth 1 -type f -executable
此命令会直接列出$PATH中所有可执行文件的完整路径。
组合查询:获取所有命令(内置+外部)
要同时列出内置命令和外部命令,可将compgen -b与遍历$PATH的结果合并:

{ compgen -b; echo $PATH | tr ':' '\n' | xargs -I {} ls {} | grep -v '^/'; } | sort -u
通过将两组命令的输出合并,再经sort -u去重,即可得到完整的命令列表。
按类型分类查看命令
compgen命令支持按命令类型分类查询,常见选项如下:
| 选项 | 命令类型 | 示例输出(部分) |
|---|---|---|
-b |
内置命令(builtin) | cd, echo, export, read |
-c |
所有命令(内置+外部) | ls, grep, cd, if |
-k |
关键字(Shell保留字) | if, then, else, for |
-a |
别名(alias) | ll='ls -alF', la='ls -A' |
-f |
函数(function) | 用户自定义的Shell函数 |
查看所有别名命令:
compgen -a
查看所有关键字(用于Shell编程):
compgen -k
工具辅助:更高效的命令查看方式
apropos:通过关键词搜索命令
若不确定命令名称,但知道功能描述,可用apropos(相当于man -k)搜索相关命令,搜索与“文件查找”相关的命令:
apropos "file find"
输出可能包含find(查找文件)、locate(快速定位文件)、grep(文本搜索)等命令及其描述。
type:判断命令类型
若需确认某个命令是内置命令、外部命令、别名还是函数,可用type命令:
type ls # 输出:ls is aliased to `ls --color=auto'(别名) type cd # 输出:cd is a shell builtin(内置命令) type grep # 输出:grep is /usr/bin/grep(外部命令)
结合type与循环,可批量检查命令类型:
for cmd in $(compgen -c); do echo "$cmd: $(type $cmd 2>/dev/null)"; done
注意事项与限制
- 权限问题:部分命令可能位于普通用户无权访问的目录(如
/sbin、/usr/sbin),需用sudo或切换至root用户查看。 - 环境差异:不同用户(如root与普通用户)的
$PATH可能不同,导致可用命令列表不一致。 - 动态加载:某些命令(如通过
source加载的Shell函数)可能不会出现在compgen的输出中,需通过type -a或declare -f查看。
相关问答FAQs
Q1:如何查看Linux系统中最近使用过的命令?
A:可通过history命令查看当前用户在Shell中执行过的历史命令,默认记录最近1000条命令(可通过echo $HISTSIZE查看),执行history后会显示带序号的命令列表,如1001 ls、1002 cd /var,若需查看特定命令的历史记录,可结合grep过滤,
history | grep "ls"
若需执行历史记录中的某条命令,可使用!序号(如!1001会重新执行ls命令)。
Q2:为什么有些命令在compgen -c的输出中,但用which查不到路径?
A:这种情况通常是因为该命令是内置命令或别名。which命令仅用于查找外部命令的路径,无法识别内置命令(如cd、echo)或用户自定义的别名(如ll='ls -alF'),可通过type命令确认类型:
type cd # 输出“cd is a shell builtin”(内置命令) type ll # 输出“ll is aliased to `ls -alF'”(别名)
若需查看内置命令的帮助信息,可使用help命令(如help cd),而非man。
