Linux命令:set

set 命令

基本介绍

set 是 Shell 内建命令,用于查看或修改当前 Shell 的运行选项、位置参数和变量。不带参数执行时,它通常会显示当前 Shell 中已定义的变量和函数。

资料合集:https://pan.quark.cn/s/6fe3007c3e95https://pan.quark.cn/s/561de99256a5https://pan.quark.cn/s/985f55b13d94https://pan.quark.cn/s/d0fb20abd19a

语法

set [选项] [参数 ...]
set -o [选项名]
set +o [选项名]
set -- [参数 ...]

set 中,- 通常表示启用选项,+ 通常表示关闭选项,这与许多普通 Linux 命令的习惯不同。

常用选项

短选项长选项名说明
-eerrexit简单命令失败时退出 Shell;存在多种语法例外
-unounset使用未设置的变量时报告错误
-xxtrace执行命令前输出展开后的命令,常用于调试
-vverbose读取 Shell 输入时原样输出
-nnoexec读取并检查命令,但不执行;交互式 Shell 通常忽略此选项
-fnoglob禁用路径名展开(通配符匹配)
-Cnoclobber防止重定向覆盖已有普通文件
-aallexport自动导出随后定义或修改的变量
-mmonitor启用作业控制
-bnotify后台作业结束时立即报告状态
-o pipefailpipefail管道中任一命令失败时,使管道返回非零状态

关闭选项时,把 - 改为 +,例如使用 set +x 关闭命令跟踪。

使用示例

1. 显示当前变量和函数

set

输出通常很多,且可能包含函数定义。若只需查看环境变量,可使用 printenvenv

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 "$#"

执行后:

  • $1apple
  • $2banana
  • $#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 可能继续执行:

  • ifwhile 的条件测试中;
  • 使用 ! 取反时;
  • &&|| 命令列表中的特定位置;
  • 未启用 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-xpipefail 等选项,也能通过 set -- 设置位置参数。编写脚本时应特别理解 set -e 的例外情况,并避免让 set -x 泄露敏感信息。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值