首页 > 解决方案 > 带有只读变量的 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

标签: bashshell

解决方案


这是因为该行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 bashor #!/bin/bash, not的 shebang!#/bin/bash

  • 我替换V="$(cat non-existant-file)"为,V=$(cat non-existant-file)因为这里不需要引号。


推荐阅读