8014

40 分钟

#Bash 的 set 命令

set [OPTION]... [ARG]... 

功能

设置参数列表或 shell 的特性。

类型

Bash 内置命令。

参数

  • OPTION 选项:
    • -a - 变量自动导出(export
    • -b - 后台作业完成时立即通知
    • -e - 如果命令以非零状态退出,则立即退出 shell
    • -f - 关闭文件名通配符功能
    • -h - 记住命令的位置,以便查找它们;通常默认开启
    • -k - 命令中形如 NAME=VALUE 的参数视作变量赋值,而非参数
    • -m - 开启作业控制;通常默认开启
    • -n - 读取命令并检查语法,但不执行
    • -p - 启用特权模式(privileged mode);忽略初始化文件
    • -t - 只执行一条命令,然后退出
    • -u - 将未定义的变量视作错误
    • -v - 详细模式;打印 shell 的所有输入(包括命令行)
    • -x - 调试模式;打印执行的命令行
    • -B - 开启大括号扩展功能;通常默认开启
    • -C - 禁止“覆盖重定向”;文件存在时 > 将失败
    • -E - 内层 shell 的ERR trap 将向外传递
    • -H - 启用 ! 前缀执行历史命令;通常默认开启
    • -P - 内置命令不跟随符号链接
    • -T - 内层 shell 的DEBUG 和 RETURN trap 将向外传递
    • +a - -a 选项的逆操作
    • +b - -b 选项的逆操作
    • +e - -e 选项的逆操作
    • +f - -f 选项的逆操作
    • +h - -h 选项的逆操作
    • +k - -k 选项的逆操作
    • +m - -m 选项的逆操作
    • +n - -n 选项的逆操作
    • +p - -p 选项的逆操作
    • +t - -t 选项的逆操作
    • +u - -u 选项的逆操作
    • +v - -v 选项的逆操作
    • +x - -x 选项的逆操作
    • +B - -B 选项的逆操作
    • +C - -C 选项的逆操作
    • +E - -E 选项的逆操作
    • +H - -H 选项的逆操作
    • +P - -P 选项的逆操作
    • +T - -T 选项的逆操作
    • -o OPT - 设置选项:
      • allexport - 同 -a
      • braceexpand - 同 -B
      • emacs - 使用 Emacs 风格的行编辑界面
      • errexit - 同 -e
      • errtrace - 同 -E
      • functrace - 同 -T
      • hashall - 同 -h
      • histexpand - 同 -H
      • history - 启用命令历史记录
      • ignoreeof - 忽略 EOF(shell 读取到 EOF 时不退出)
      • interactive-comments - 允许在交互式命令中显示注释
      • keyword - 同 -k
      • monitor - 同 -m
      • noclobber - 同 -C
      • noexec - 同 -n
      • noglob - 同 -f
      • nolog - 被忽略
      • notify - 同 -b
      • nounset - 同 -u
      • onecmd - 同 -t
      • physical - 同 -P
      • pipefail - 管道操作返回首个非 0 的返回值;默认情况下管道返回最后一个命令的返回值
      • posix - 尽可能遵循 POSIX 标准
      • privileged - 同 -p
      • verbose - 同 -v
      • vi - 使用 vi 风格的行编辑界面
      • xtrace - 同 -x
  • ARG - 剩余参数,会被依次赋值给 $1, $2 ...

#示例

修改参数列表

$ set x y z
$ echo $1 $2 $3
x y z

自动导出变量

$ NAME=primers              # 没有导出,新的 shell 里没有这个变量
$ bash -c 'echo $NAME'

$ set -a                    # 开启变量自动导出
$ NAME=primers
$ bash -c 'echo $NAME'
primers

记录命令的位置

$ type arch                         # 查看命令的类型,返回命令的路径
arch is /usr/bin/arch
$ arch                              # 执行一次该命令
x86_64
$ type arch                         # 再次查看命令的类型,显示命令被哈希缓存,不再从 PATH 中进行查找
arch is hashed (/usr/bin/arch)

将命令中的变量赋值视作环境变量

$ NAME=primers bash -c 'echo $NAME' # 写在命令之前的变量会成功该命令的环境变量
primers
$ bash -c 'echo $NAME' NAME=primers # 写在命令之后的不会被视作变量,而是作为命令的参数传入

$ set -k                            # 使命令行中的所有赋值语句都视作创建变量
$ bash -c 'echo $NAME' NAME=primers
primers

大括号扩展功能

$ echo {1..8}                       # 生成序列
1 2 3 4 5 6 7 8
$ echo file{1,2,3}.txt              # 生成列表
file1.txt file2.txt file3.txt
$ echo {x,y,z}{1..5}                # 组合生成
x1 x2 x3 x4 x5 y1 y2 y3 y4 y5 z1 z2 z3 z4 z5

! 历史命令

$ echo https://xplanc.org/primers/
https://xplanc.org/primers/
$ !e                                # 执行最近一条以 e 开头的命令
echo https://xplanc.org/primers/
https://xplanc.org/primers/

调试脚本

set -x          # 调试模式,打印每条命令
...
set -v          # 详细模式,打印命令和所有输入
...

遇到错误时立即退出脚本

set -e          # 任何命令返回非 0 时,立即退出当前脚本
...

#手册

更新: 2026/4/24

作者: PlanC

创建: 2026/4/15