本文目录导读:

在Shell脚本中实现“安全模式”通常指启用一组严格的错误处理选项,让脚本在遇到任何错误时立即退出,避免在错误状态下继续执行导致更严重的问题,以下是几种常见的实现方式:
基础安全模式(最常用)
在脚本开头添加:
#!/bin/bash set -euo pipefail
各选项说明:
-e:遇到任何非零返回值时立即退出-u:使用未定义变量时立即退出(防止拼写错误)-o pipefail:管道中任何命令失败时,整个管道返回失败状态-x(可选):打印执行的每条命令(调试用)
完整安全模式示例
#!/bin/bash
set -euo pipefail
IFS=$'\n\t'
# 脚本主体
main() {
echo "安全模式运行中..."
# 演示:未定义变量会报错
# echo "$undefined_var" # 这行会触发错误
# 演示:命令失败会退出
# ls /nonexistent_directory # 这行会触发错误
echo "脚本执行成功"
}
# 捕获信号
trap 'echo "脚本被中断"; exit 1' INT TERM
main "$@"
自定义错误处理函数
#!/bin/bash
# 启用严格模式
set -euo pipefail
# 自定义错误处理
error_handler() {
local exit_code=$?
local line_no=$1
echo "错误发生在第 $line_no 行,退出代码: $exit_code"
exit $exit_code
}
# 设置trap捕获错误
trap 'error_handler $LINENO' ERR
# 脚本主体
echo "开始执行..."
# 故意制造错误
# cat /etc/shadow 2>/dev/null || true # 这行会触发ERR trap
echo "正常结束"
针对关键操作的局部安全模式
#!/bin/bash
# 默认不启用严格模式
set +e
# 对特定代码块启用严格模式
safe_block() {
set -e
echo "在安全块中执行..."
# 这里的错误会中断执行
false
echo "这行不会被执行"
}
# 调用安全块
# safe_block || echo "安全块失败,但脚本继续"
# 非严格模式继续
echo "脚本继续执行"
函数级别的安全模式
#!/bin/bash
# 只在特定函数内启用严格模式
dangerous_function() {
set -e
local file=$1
if [[ ! -f "$file" ]]; then
echo "错误:文件不存在"
return 1
fi
# 处理文件
cat "$file" > /dev/null
}
# 主脚本
main() {
dangerous_function "/nonexistent" || {
echo "函数失败,但主脚本继续"
}
}
main "$@"
测试示例
#!/bin/bash
set -euo pipefail
test_safe_mode() {
echo "=== 测试1: 未定义变量 ==="
# 取消注释测试
# echo "$UNDEFINED_VAR"
echo "=== 测试2: 命令失败 ==="
# 取消注释测试
# false
# echo "这条消息不会显示"
echo "=== 测试3: 管道失败 ==="
# 取消注释测试
# grep "pattern" /nonexistent | wc -l
echo "所有测试通过"
}
test_safe_mode
生产环境建议的安全模式
#!/bin/bash
# 严格模式
set -euo pipefail
# 防止通配符扩展为空
shopt -s nullglob
# 设置安全的PATH
PATH="/usr/local/bin:/usr/bin:/bin"
# 默认退出函数
die() {
echo "错误: $*" >&2
exit 1
}
# 主逻辑
main() {
# 检查依赖
command -v curl >/dev/null 2>&1 || die "需要curl命令"
# 安全的变量检查
local required_var="${1:-}"
[[ -n "$required_var" ]] || die "缺少必需参数"
# ... 脚本主体
}
main "$@"
注意事项
- 选择性使用:不是所有脚本都需要启用全部严格模式
- 与外部命令兼容:某些命令(如
grep无匹配时)会返回非零状态,需要用|| true处理 - 调试时临时禁用:可以临时添加
set +e来允许某些命令失败 - 文档化:在脚本开头注释说明启用了哪些安全选项
选择哪种安全模式取决于脚本的复杂度和风险程度,对于关键系统脚本,建议使用set -euo pipefail作为基线,并根据需要添加额外的安全措施。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
足球直播
足球直播
足球直播
篮球直播
篮球直播
篮球直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
亚冠直播
亚冠直播
亚冠直播
欧冠直播
欧冠直播
欧冠直播
英超直播
英超直播
英超直播
西甲直播
西甲直播
西甲直播
中超直播
中超直播
中超直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
曼联直播
曼联直播
曼联直播
日职联直播
日职联直播
日职联直播
澳超直播
澳超直播
澳超直播
阿森纳直播
阿森纳直播
阿森纳直播
足球直播
足球直播
足球直播
NBA直播
NBA直播
NBA直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
欧冠直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
篮球直播
篮球直播
篮球直播
篮球直播
篮球直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播
中超直播