对于GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu)

#! /bin/bash
set -u

exec {FD1}>tmp1.txt
declare -r FD1
echo "fd1: $FD1"       # why does this work,

function f1() {
  exec {FD2}>tmp2.txt
  readonly FD2
  echo "fd2: $FD2"     # this work,
}

f1

function f2() {
  exec {FD3}>tmp3.txt
  echo "fd3: $FD3"     # and even this work,
  declare -r FD3
  echo "fd3: $FD3"     # when this complains: "FD3: unbound variable"?
}

f2

目标是使我的文件描述符只读

最佳答案

我不认为是虫子。exec语句为全局范围内的参数FD3指定一个值,而declare语句创建一个隐藏全局的局部参数:
在函数中使用时,“declare”使名称成为本地名称,就像“local”一样
命令。“-g”选项禁止此行为。
未定义的是本地参数。您可以通过一个稍有不同的示例看到这一点:

$ FD3=foo
$ f () { FD3=bar; declare -r FD3=baz; echo $FD3; }
$ f
baz   # The value of the function-local parameter
$ echo $FD3
bar   # The value of the global parameter set in f

关于bash - 为什么在使用set -u时不能在函数内使用`declare -r`来将变量标记为只读?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30042157/

10-10 17:46