bash - 带有只读变量的 shell 脚本“set -e”
问题描述
这按预期工作:
#!/bin/bash
set -ex
V="$(cat non-existant-file)"
echo "var V: $V"
由于“set -e”,脚本在第 3 行失败并在不执行第 4 行的情况下退出。
现在,小改动:
#!/bin/bash
set -ex
readonly V="$(cat non-existant-file)"
echo "var V: $V"
现在脚本执行第 4 行。在运行脚本时的行为相同sh
。
解决方案
这是因为该行readonly V="$(cat non-existant-file)"
不是一个简单的赋值:它是一个失败的赋值的组合,然后是readonly V
成功的指令。
local
这解释了您观察到的行为,并且在@codeforester 指示的文档BashFAQ/105中提到了类似构造 ( ) 的这个 Bash 陷阱。
因此,如果您尝试使用以下代码,您应该观察到您期望的行为:
#!/bin/bash
set -ex
V=$(cat non-existant-file)
readonly V
echo "var V: $V"
小意见:
我更正了应该是
#!/usr/bin/env bash
or#!/bin/bash
, not的 shebang!#/bin/bash
我替换
V="$(cat non-existant-file)"
为,V=$(cat non-existant-file)
因为这里不需要引号。
推荐阅读
- html - 无法在 IE 上打印第二页
- java - 将拆分 to_char 语句从 Oracle 转换为 Java 中的 SQL Server
- apache-kafka - 基于 kafka 的多点订购服务的真正用途是什么
- c# - Azure 函数部署错误:您的函数应用面向 V1,但 Azure 主机的函数版本为 V2,
- c++ - 检查两个对象组合的空值的最佳方法
- javascript - 垂直滚动条在 IE8/IE9 中不起作用
- visual-studio-2017 - 切换回 packages.config - 澄清答案
- kubernetes - Kubernetes 上的日志记录和事件跟踪器
- node.js - 如何将 use() 的实例应用于除 app.use(express.static("dist")) 传递的路由之外的所有路由?
- css - 即使在更改版本、硬刷新和清除缓存后 CSS 更改也不会反映