set 命令
基本介绍
set 是 Shell 内建命令,用于查看或修改当前 Shell 的运行选项、位置参数和变量。不带参数执行时,它通常会显示当前 Shell 中已定义的变量和函数。
资料合集:https://pan.quark.cn/s/6fe3007c3e95、https://pan.quark.cn/s/561de99256a5、https://pan.quark.cn/s/985f55b13d94、https://pan.quark.cn/s/d0fb20abd19a
语法
set [选项] [参数 ...]
set -o [选项名]
set +o [选项名]
set -- [参数 ...]
在 set 中,- 通常表示启用选项,+ 通常表示关闭选项,这与许多普通 Linux 命令的习惯不同。
常用选项
| 短选项 | 长选项名 | 说明 |
|---|---|---|
-e | errexit | 简单命令失败时退出 Shell;存在多种语法例外 |
-u | nounset | 使用未设置的变量时报告错误 |
-x | xtrace | 执行命令前输出展开后的命令,常用于调试 |
-v | verbose | 读取 Shell 输入时原样输出 |
-n | noexec | 读取并检查命令,但不执行;交互式 Shell 通常忽略此选项 |
-f | noglob | 禁用路径名展开(通配符匹配) |
-C | noclobber | 防止重定向覆盖已有普通文件 |
-a | allexport | 自动导出随后定义或修改的变量 |
-m | monitor | 启用作业控制 |
-b | notify | 后台作业结束时立即报告状态 |
-o pipefail | pipefail | 管道中任一命令失败时,使管道返回非零状态 |
关闭选项时,把 - 改为 +,例如使用 set +x 关闭命令跟踪。
使用示例
1. 显示当前变量和函数
set
输出通常很多,且可能包含函数定义。若只需查看环境变量,可使用 printenv 或 env。
2. 启用命令跟踪
set -x
name="Linux"
echo "Hello, $name"
set +x
set -x 会在命令执行前输出展开后的内容,适合调试脚本。调试结束后可用 set +x 关闭。
3. 遇到未设置变量时报错
set -u
echo "$UNDEFINED_VARIABLE"
引用未定义变量时,Shell 会报告错误。可以使用默认值避免错误:
echo "${UNDEFINED_VARIABLE:-默认值}"
4. 命令失败时退出脚本
set -e
cp source.txt backup.txt
echo "复制成功"
如果 cp 失败,脚本通常不会继续执行后面的 echo。但 -e 在条件判断、逻辑运算、管道等上下文中存在例外,不应将其视为完整的异常处理机制。
5. 检测管道中的失败
set -o pipefail
false | tee output.log
echo "$?"
默认情况下,管道退出状态通常取最后一个命令的状态。启用 pipefail 后,只要管道中有命令失败,整个管道就可能返回非零状态。
6. 常见严格模式组合
set -euo pipefail
该组合可帮助脚本尽早暴露错误:
-e:命令失败时通常退出;-u:使用未设置变量时报错;-o pipefail:检测管道内部的失败。
使用前应了解各选项的边界行为,特别是 set -e。
7. 设置位置参数
set -- apple banana cherry
echo "$1"
echo "$2"
echo "$#"
执行后:
$1为apple;$2为banana;$#为3。
-- 表示结束选项解析,因此即使后续参数以 - 开头,也会被当作普通位置参数。
8. 清空位置参数
set --
echo "$#"
此时位置参数数量为 0。
9. 遍历解析后的参数
set -- "file one" "file two" "file three"
for item in "$@"; do
printf '%s\n' "$item"
done
使用 "$@" 能保持每个参数原有的边界。
10. 查看所有选项状态
set -o
以易读格式显示各选项是开启还是关闭。
以下命令输出可用于恢复当前选项状态的命令形式:
set +o
set -e 的常见例外
set -e 并非任何非零状态都会立即退出。例如,失败命令位于以下上下文时,Shell 可能继续执行:
if或while的条件测试中;- 使用
!取反时; &&或||命令列表中的特定位置;- 未启用
pipefail时,管道中除最后一个命令之外的位置。
因此,关键操作仍可显式处理错误:
if ! important_command; then
echo "命令执行失败" >&2
exit 1
fi
set 与相关命令的区别
set:管理 Shell 选项、位置参数,并可显示 Shell 变量和函数。env:显示环境变量,或在修改后的环境中运行程序。printenv:显示全部或指定环境变量。export:将 Shell 变量标记为可由子进程继承的环境变量。unset:删除变量或函数。shopt:管理 Bash 专有的可选行为。
注意事项
set是 Shell 内建命令,而不是独立的可执行文件。- 不同 Shell(如 Bash、Dash、Zsh、Ksh)支持的选项和行为可能不同。
set -x可能将密码、令牌或密钥等敏感值输出到终端或日志,处理敏感数据前应关闭跟踪。set -n不能代替专业静态检查工具;检查 Shell 脚本时也可使用bash -n script.sh。- 可通过
help set查看 Bash 的内建帮助,通过man bash查看详细规则。
相关命令
shopt:设置 Bash 专有选项。export:导出环境变量。unset:删除变量或函数。shift:移动位置参数。env:查看或临时修改命令环境。printenv:显示环境变量。
总结
set 是控制 Shell 行为的重要内建命令。它既能启用 -e、-u、-x 和 pipefail 等选项,也能通过 set -- 设置位置参数。编写脚本时应特别理解 set -e 的例外情况,并避免让 set -x 泄露敏感信息。

2384

被折叠的 条评论
为什么被折叠?



