这篇文章是单独讲一下别名的作用和该怎么设置它

Shell中的命令

首先我们得知道,在shell中有两类命令可以执行

1
注:shell是Linux的应用程序,是帮助用户与内核沟通的工具

1. 内部命令(Built-in Commands)

  • 来源:Shell解释器内置功能
  • 特性
    • 随Shell启动加载至内存常驻
    • 执行时无磁盘I/O操作
    • 通常提供基础系统功能(如cd、echo等)
  • 优势
    • 执行效率极高(无进程创建开销)
    • 可直接访问Shell内部状态

2. 外部命令(External Commands)

  • 来源:文件系统中的独立可执行程序
  • 特性
    • 存储于$PATH路径下(如/bin/ls)
    • 执行时需从磁盘加载至内存
    • 运行后立即释放内存资源
    • 运行一次后会存储进哈希表,方便二次调用
  • 执行流程
    1. Shell创建子进程
    2. 通过exec系统调用加载程序
    3. 程序退出后资源回收
  • 优势
    • 功能模块化(可独立更新)
    • 支持多语言开发(如C/Python等)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

#which:查找文件,后面跟其他命令的名称可以查询命令所在的路径
which [选项] <命令名>
选项:
-a 显示环境变量PATH中所有匹配的路径(默认只显示第一个)
--skip-alias: 忽略Shell中的别名,只查找真实文件
--read-alias: 不从标准输入读取别名(默认开启)

# whereis:在特定目录中查找符合条件的文件。这些文件属于原始代码、二进制文件,或是帮助文件。只能用于查找二进制文件、源代码文件和man手册页,一般文件的定位得使用locate命令。
where [选项] <命令名>
选项:
-b 只查找二进制文件
-B <目录> 只在设置的目录下查找二进制文件
-f 不显示文件名前的路径名称
-m 只查找原始代码文件
-M
-s
-S
-u

Hash表

​ 系统初始hash表为空,当外部命令执行时,默认会从PATH路径下寻找该命令,找到后会将这条命令的路径记录到hash表中,当再次使用该命令时,shell解释器首先会查看hash表,存在将执行之,如果不存在,将会去PATH路径下寻找,利用hash缓存表可大大提高命令的调用速率

1
2
3
4
5
6
7
8
9
10
11
12
13
# hash:显示hash缓存
hash [选项]
选项:
-l 详细显示哈希缓存
# hash -l
-p 添加自定义哈希别名
# hash -p /path/to/command <别名>
-t 查看命令路径
# hash -t <指令名>
-d 删除指定命令的缓存
# hash -d <指令名>
-r 完全清空shell的哈希表
# hash -r

注意:hash的别名只能运行命令,不能像alias一样带上选项和参数

命令别名

​ 对于长期使用或长度较长的命令可以定义为较短的别名方便执行

1
2
3
# alias:显示当前shell进程所有可用的命令别名
alias <别名>='命令全称'
# alias Downfirewalld='systemctl stop firewalld;setenforce 0'

同时别名也能进行撤销

1
2
3
# unalias [选项] <别名名称>
选项:
-a 取消所有别名,后面不需要再跟别名名称

注:该指令命名的别名只能在当前shell进程中有效

别名永久化配置:

1
2
3
4
5
6
7
8
9
# 将别名写入配置文件中即可永久生效
echo "alias <别名>='命令全称'" >> 配置文件
配置文件路径:
# 仅对当前用户有效:~/.bashrc
# 对所有用户有效:/etc/bashrc

# 添加完后还需刷新配置文件,使用以下指令:
source 配置文件
# 普通用户只有~/.bashrc,root用户才能碰/etc/bashrc