Shell内置命令

在 Shell(如 Bash)中,内置命令(Built-in Commands) 是由 Shell 解释器直接执行的命令,无需启动外部程序(如 /bin/ls 这样的独立可执行文件)。它们的执行效率更高,且通常用于控制 Shell 自身的行为(如变量管理、流程控制、进程管理等)。

data-ad-format="fluid" data-ad-layout-key="-7k+ex-4a-9w+4a">

主流 Shell(如 Bash)的内置命令数量通常在 几十个(而非 80 个)。以下以最常用的 Bash 为例,分类整理其核心内置命令,并说明功能。

**NAME

1
2
3
4
5
6
7
8
bash,  :,  .,  [, alias, bg, bind, break, builtin, caller, cd, command, compgen,
complete, compopt, continue, declare, dirs, disown, echo, enable, eval,
exec, exit, export, false, fc, fg, getopts,hash, help, history, jobs, kill,
let, local, logout, mapfile, popd, printf, pushd, pwd, read, readonly,
return, set, shift, shopt, source, suspend, test, times, trap, true,
type, typeset, ulimit,umask, unalias, unset, wait - bash built-in commands,
see bash(1)

一、Bash 内置命令分类及详解

Bash 的内置命令可分为以下几类,覆盖 Shell 自身管理、流程控制、变量操作、进程管理等场景。

1. Shell 自身管理与元命令

这类命令用于控制 Shell 的运行状态、解析规则或调试。

命令功能描述:空命令(Null Command),仅返回状态码 0(常用于条件语句占位或循环体)。示例:while :; do sleep 1; done(无限循环)。.(或 source)在当前 Shell 环境中执行指定脚本文件(而非子 Shell),脚本中对变量/函数的修改会影响当前 Shell。示例:. ./config.sh 或 source ./config.sh。alias定义或查看别名(Alias)。示例:alias ll=’ls -l’(定义别名);alias(查看所有别名)。unalias删除已定义的别名。示例:unalias ll。bash启动一个新的 Bash 子 Shell(可通过参数调整行为,如 bash -c ‘echo hello’)。exit终止当前 Shell 或子 Shell,并返回指定的退出状态码(默认 0)。示例:exit 1(终止并返回错误码 1)。exec用指定命令替换当前 Shell 进程(不创建新进程)。示例:exec ./app(当前 Shell 变为 app 进程)。getopts解析命令行选项(用于脚本处理参数)。示例:while getopts “a:b:” opt; do … done(处理 -a val -b val 格式参数)。hash管理 Shell 的命令路径缓存(加速命令查找)。示例:hash(查看缓存);hash -r(清空缓存)。pwd打印当前工作目录(Print Working Directory)。示例:pwd(输出 /home/user)。times显示 Shell 及其子进程的累计执行时间。示例:times(输出用户时间和系统时间)。trap设置信号捕获(当 Shell 收到指定信号时执行自定义命令)。示例:trap ‘echo 退出’ EXIT(Shell 退出时执行 echo 退出)。umask设置或查看文件权限掩码(控制新建文件的默认权限)。示例:umask 022(默认文件权限 644,目录 755)。unset删除变量或函数。示例:unset var(删除变量 var);unset -f func(删除函数 func)。

2. 流程控制与结构化命令

用于实现条件判断、循环等程序逻辑。

命令功能描述if条件判断(配合 then/elif/else/fi)。示例:if [ $a -gt 10 ]; then echo “大”; elif [ $a -eq 10 ]; then echo “等于”; else echo “小”; fi。case多分支匹配(类似 switch-case)。示例:case $var in
“start”) echo “启动” ;;
“stop”) echo “停止” ;;
*) echo “未知” ;;
esac。for循环遍历列表(或命令输出)。示例:for i in {1..5}; do echo $i; done(遍历 1-5);for file in *.txt; do cat $file; done(遍历所有 .txt 文件)。while当条件为真时循环执行。示例:while read line; do echo $line; done < file.txt(逐行读取文件并输出)。until当条件为假时循环执行(与 while 相反)。示例:until [ $count -ge 5 ]; do echo $count; ((count++)); done(输出 0-4)。select生成交互式菜单(从列表中选择选项)。示例:select opt in “苹果” “香蕉” “退出”; do
if [ “$opt” = “退出” ]; then break; fi
echo “选择了:$opt”
done。break终止当前循环(for/while/until)。示例:for i in {1..10}; do if [ $i -eq 5 ]; then break; fi; echo $i; done(输出 1-4)。continue跳过当前循环的剩余代码,进入下一次迭代。示例:for i in {1..5}; do if [ $i -eq 3 ]; then continue; fi; echo $i; done(输出 1-2,4-5)。

3. 变量与参数操作

用于管理 Shell 变量、位置参数(如 $1, $@)或特殊参数(如 $#)。

命令功能描述declare声明变量类型(如整数、只读、数组等)。示例:declare -i num=10(声明整数变量);declare -r const=5(声明只读变量);declare -a arr=(1 2 3)(声明数组)。typesetdeclare 的同义词(兼容旧版本)。export将变量导出为环境变量(子进程可继承)。示例:export PATH=$PATH:/usr/local/bin(将路径加入环境变量)。local在函数内部声明局部变量(避免污染全局作用域)。示例:func() { local x=10; echo $x; }(函数内 $x 不影响外部)。readonly声明只读变量(不可修改或取消)。示例:readonly PI=3.14(尝试修改 PI=3 会报错)。test测试条件表达式(返回状态码 0 或 1)。示例:test -f file.txt(判断是否为普通文件);test $a -gt $b(判断 $a 是否大于 $b)。[ ]test 的同义词(需注意方括号内的空格)。示例:[ -z “$var” ](判断变量是否为空)。[[ ]]增强版条件测试(支持正则匹配、逻辑运算符 &&/`

4. 输入输出与重定向

用于控制数据输入来源或输出目标(部分命令需配合重定向符号 >/< 使用)。

命令功能描述read从标准输入读取一行数据到变量。示例:read name(读取用户输入到 name);read -t 5 -p “请输入:” input(5 秒超时提示输入)。printf格式化输出(类似 C 语言的 printf)。示例:printf "姓名:%s,年龄:%d" “张三” 20(输出 姓名:张三,年龄:20)。echo输出字符串(支持转义字符)。示例:echo "HelloWorld"(输出两行);echo -e "启用转义:\\t""(-e启用转义,输出启用转义:\ ")。

5. 进程与作业管理

用于控制后台任务、前台任务切换或进程终止。

命令功能描述bg将暂停的作业(Job)放到后台继续运行。示例:bg %1(将作业 1 后台运行)。fg将后台作业切换到前台运行。示例:fg %2(将作业 2 前台运行)。jobs查看当前 Shell 中的后台作业状态。示例:jobs -l(显示作业编号、PID、状态)。kill终止指定进程或作业。示例:kill 1234(终止 PID 为 1234 的进程);kill %1(终止作业 1)。wait等待所有或指定后台作业完成。示例:wait %1(等待作业 1 完成);wait(等待所有后台作业)。

二、Bash 内置命令的数量统计

Bash 的内置命令数量会因版本不同略有差异(如 Bash 5.x 比 4.x 新增了部分命令),但核心内置命令通常在 60-70 个 左右(包括上述分类中的命令)。可以通过 compgen -b 命令在终端中查看当前 Bash 环境的所有内置命令:

1
2
compgen -b | wc -l  # 统计内置命令数量(输出约 60-70)

1
2
3
root# compgen  -b|wc -l
61

三、内置命令 vs 外部命令

  • 内置命令:由 Shell 直接执行,无需启动子进程(速度快),可访问 Shell 内部状态(如变量、作业)。

  • 外部命令:独立可执行文件(如 /bin/ls、/usr/bin/grep),需通过 fork() + exec() 启动子进程(速度较慢),无法直接修改 Shell 内部状态(如无法用 ls 定义变量)。

总结

实际主流 Shell(如 Bash)的内置命令数量约为 60-70 个,覆盖 Shell 自身管理、流程控制、变量操作等核心场景。掌握这些内置命令是编写高效 Shell 脚本的基础。

data-ad-format="auto" data-full-width-responsive="true">