具有只读变量的外壳脚本"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

这解释了你观察到的行为,并且在@codeforester指示的文档 BashFAQ/105 中提到了这个 Bash 陷阱(local(。

因此,如果您尝试以下代码,则应观察预期的行为:

#!/bin/bash
set -ex
V=$(cat non-existant-file)
readonly V
echo "var V: $V"

小备注:

  • 我更正了应该#!/usr/bin/env bash#!/bin/bash的shebang,而不是!#/bin/bash

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

最新更新