这按预期工作:
#!/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)"
,因为这里不需要引号。