Shell内置命令

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

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

**NAME

   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<br> "start") echo "启动" ;;<br> "stop") echo "停止" ;;<br> *) echo "未知" ;;<br>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<br> if [ "$opt" = "退出" ]; then break; fi<br> echo "选择了:$opt"<br>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 “Hello
World”(输出两行);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 环境的所有内置命令:

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

三、内置命令 vs 外部命令

总结

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

此条目发表在linux文章分类目录,贴了标签。将固定链接加入收藏夹。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注