Contents

在Linux中列出所有可用命令和别名

1. 概述

有时在 Linux 中工作时,我们想知道系统支持的所有命令和别名。

众所周知,别名是用于引用实际命令的自定义快捷方式。它可以通过将长命令自定义为短字符串来帮助我们节省时间。

在本教程中,我们将看到三种列出 Linux 中所有可用命令和别名的方法——使用*compgen 命令、使用alias *命令以及编写 Bash 脚本。

2. 使用compgen命令

使用compgen命令,我们可以使用不同的选项列出命令、别名、内置函数、关键字和函数。

2.1.列出命令

我们使用compgen -c命令列出所有可用的命令:

$ compgen -c
alert
egrep
fgrep
grep
l
la
ll
ls
...

在这里,-c选项告诉compgen列出我们可以在系统上执行的所有命令。

2.2. 列出别名

我们使用compgen -a命令列出所有可用的别名:

$ compgen -a
alert
egrep
fgrep
grep
l
la
ll
ls
...

在这里,-a选项告诉compgen列出所有别名。

3. 使用alias命令

使用alias命令,我们可以列出定义的别名:

$ alias -p | cut -d= -f1 | cut -d' ' -f2
alert
egrep
fgrep
grep
l
la
ll
ls
...

这里,-p选项告诉alias命令打印所有定义的别名。然后,我们将输出传递给第一个*cut 命令。cut命令使用=符号作为分隔符将一行划分为字段,-f1*表示我们取第一个字段。

我们通过管道将第一个cut命令的输出传递给第二个cut命令。它使用空格作为分隔符,我们选择第二个字段并将其显示在终端上。

4. 使用 Bash 脚本

我们可以编写一个 Bash 脚本来列出我们系统上所有可用的命令:

#!/bin/bash
echo $PATH  | tr : '\n' |
while read e; do
    for i in $e/*; do
        if [[ -x "$i" && -f "$i" ]]; then
            echo $i
        fi
    done
done

让我们分解上面的脚本。首先,我们使用*$PATH 环境变量获取所有包含可执行文件的目录路径。然后,我们将输出通过管道传递给tr 命令。tr命令将:输入转换为换行符,并将输出通过管道传输到while*循环。

while循环使用*read * 命令读取每一行并将每个步骤的内容存储在*$e中。使用for循环,我们遍历每个目录并使用-x选项检查每个文件是否是可执行文件。-f*选项检查文件是否存在以及它是否是常规文件。

一旦文件名通过了两个测试,它的路径就会使用*echo *命令显示在终端上。

现在,让我们运行脚本并检查其输出:

$ bash commands.sh
/usr/sbin/aa-remove-unknown
/usr/sbin/aa-status
/usr/sbin/aa-teardown
/usr/sbin/accessdb
/usr/sbin/add-shell
/usr/sbin/addgnupghome
/usr/sbin/addgroup
/usr/sbin/adduser
/usr/sbin/agetty
...

在这里,我们可以看到所有命令的绝对路径。