这按预期工作:
#!/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
中运行脚本时,行为相同。
答案 0 :(得分:3)
这是因为readonly V="$(cat non-existant-file)"
行不是简单的分配:它是分配失败的组成,其次是指令readonly V
,成功了。
这解释了您观察到的行为,并且@codeforester指出的文档BashFAQ/105中的类似构造(local
)也提到了Bash陷阱。
因此,如果尝试改用以下代码,则应遵守预期的行为:
#!/bin/bash
set -ex
V=$(cat non-existant-file)
readonly V
echo "var V: $V"
次要评论:
我更正了应该是#!/usr/bin/env bash
或#!/bin/bash
而不是!#/bin/bash
我将V="$(cat non-existant-file)"
替换为V=$(cat non-existant-file)
,因为此处不需要引号。