【问题标题】:Is it possible to reuse readonly variables in bash sub-shells?是否可以在 bash 子 shell 中重用只读变量?
【发布时间】:2016-07-05 01:19:43
【问题描述】:

在 Bash 中,在子 shell 中声明的变量与在父 shell 中声明的同名变量不同,除非后者显式 exported:

a=12
(a=13; echo $a)
echo $a

# Output:
# 13
# 12 Outer variable wasn't changed

但是,如果外部变量声明为readonly,子shell 无法重新定义它,从而阻止重复使用相同的名称,即使它不会造成任何伤害:

readonly a=12
(a=13; echo $a)
echo $a

# Output:
# test.sh: line 2: a: readonly variable
# 12 Only the outer echo is executed

如果我声明readonly也是子shell中的变量,我仍然会得到同样的错误,但是这次子shell中的echo也被执行了:

readonly a=12
(readonly a=13; echo $a)
echo $a

# Output:
# test.sh: line 2: a: readonly variable
# 12 global value is used in sub-shell
# 12

现在,就我的目标而言,避免子函数(由其他函数调用的函数)中定义的变量与同名父函数中定义的变量冲突,我可以满足于使用非@ 987654328@ 父外壳中的变量。但是,如果不打算更改变量,将变量声明为 readonly 非常有用,因为它有助于防止多种错误,所以我想避免放弃它们。

那么,您知道是否有一种方法可以在子 shell 中重用在父 shell 中声明为 readonly 的变量名?

【问题讨论】:

  • 只要不改变就可以使用。但是您想使用它们并更改子外壳中的值吗?
  • @J.Chomel 是的,我想使用相同的名称,但具有不同的值。关键是现在,每次我编写一个新函数并在其中定义变量时,我总是有与调用堆栈中已经定义的名称发生冲突的风险。不应该要求我正在编写的新函数知道某个名称是否已经被某个父调用者定义为readonly,并且当我调用一个函数时,我不应该检查它定义的所有名称以及所有在决定我是否可以将名称声明为 readonly 之前,请先查看子函数。我希望 sub-shells 允许我这样做。

标签: bash shell readonly shadowing subshell


【解决方案1】:

从这篇帖子 Use of read-only variables in shell scripts 看来,只读状态似乎不会被子进程继承。

所以你可以启动一个子进程,而不是像这样的子shell:

readonly a=12
bash -c 'a=13; echo $a'
echo $a

输出:

13
12

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-25
    • 2017-12-09
    • 2014-01-19
    • 2019-04-28
    • 1970-01-01
    • 2013-06-28
    • 2021-12-05
    • 2011-12-26
    相关资源
    最近更新 更多