菜鸟科技网

Linux如何显示所有可用命令?

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

Linux如何显示所有可用命令?-图1
(图片来源网络,侵删)

基础命令:查看内置命令与可执行程序

Linux命令分为两类:内置命令(Shell自带的命令,如cdecho)和外部命令(独立的可执行程序,如lsgrep),通过不同命令可分别查看这两类命令。

查看所有内置命令:compgen -b

内置命令是Shell的核心功能,直接由Shell进程执行,无需调用外部程序,使用compgen命令(Bash内置的命令补全工具)可快速列出所有内置命令:

compgen -b

输出结果包含ifthenwhileforcdechoexport等常用内置命令,这些命令无法通过whichwhereis查到路径,因为它们不是独立的可执行文件。

查看所有外部命令:遍历$PATH环境变量

外部命令存储在系统目录中,其路径由$PATH环境变量指定(如/bin/usr/bin/usr/local/bin等),要查看所有外部命令,可遍历$PATH中的目录并列出其中的可执行文件:

Linux如何显示所有可用命令?-图2
(图片来源网络,侵删)
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:排序并去重,最终得到所有外部命令列表。

若需查看命令路径,可结合whichwhereis

echo $PATH | tr ':' '\n' | xargs -I {} find {} -maxdepth 1 -type f -executable

此命令会直接列出$PATH中所有可执行文件的完整路径。

组合查询:获取所有命令(内置+外部)

要同时列出内置命令和外部命令,可将compgen -b与遍历$PATH的结果合并:

Linux如何显示所有可用命令?-图3
(图片来源网络,侵删)
{ 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

注意事项与限制

  1. 权限问题:部分命令可能位于普通用户无权访问的目录(如/sbin/usr/sbin),需用sudo或切换至root用户查看。
  2. 环境差异:不同用户(如root与普通用户)的$PATH可能不同,导致可用命令列表不一致。
  3. 动态加载:某些命令(如通过source加载的Shell函数)可能不会出现在compgen的输出中,需通过type -adeclare -f查看。

相关问答FAQs

Q1:如何查看Linux系统中最近使用过的命令?
A:可通过history命令查看当前用户在Shell中执行过的历史命令,默认记录最近1000条命令(可通过echo $HISTSIZE查看),执行history后会显示带序号的命令列表,如1001 ls1002 cd /var,若需查看特定命令的历史记录,可结合grep过滤,

history | grep "ls"

若需执行历史记录中的某条命令,可使用!序号(如!1001会重新执行ls命令)。

Q2:为什么有些命令在compgen -c的输出中,但用which查不到路径?
A:这种情况通常是因为该命令是内置命令别名which命令仅用于查找外部命令的路径,无法识别内置命令(如cdecho)或用户自定义的别名(如ll='ls -alF'),可通过type命令确认类型:

type cd  # 输出“cd is a shell builtin”(内置命令)
type ll  # 输出“ll is aliased to `ls -alF'”(别名)

若需查看内置命令的帮助信息,可使用help命令(如help cd),而非man

分享:
扫描分享到社交APP
上一篇
下一篇