繁体   English   中英

bash arrays 通过在 function 内部采购而创建,具有本地 Z31A1FD140BEA4BEF2D11E12A589

[英]bash arrays created by sourcing inside a function have local scope but scalars are global

考虑以下 bash 脚本:

#!/usr/bin/env /bin/bash

function sourcefile(){
  source /tmp/srcfile
  echo "Sourced array in func: ${sourcedarray[*]}"
  echo "Sourced scalar in func: ${sourcedscalar}"
}

globalarray=([0]="xyzzy" [1]="kaboom")
globalscalar="argle"

cat >/tmp/srcfile <<EOF
export sourcedscalar="bargle"
export sourcedarray=([0]="foo" [1]="bar")
EOF

sourcefile

echo "Global array: ${globalarray[*]}"
echo "Global scalar: ${globalscalar}"
echo "Sourced array: ${sourcedarray[*]}"
echo "Sourced scalar: ${sourcedscalar}"

人们可以合理地期望在 output 中设置所有四个值,但至少在 bash 版本3.2.57(1)-release中设置(是的,是的,我知道:我们都为 Apple 的偏执买单),但事实并非如此:

Sourced array in func: foo bar
Sourced scalar in func: bargle
Global array: xyzzy kaboom
Global scalar: argle
Sourced array:
Sourced scalar: bargle

据我所知:

  • 在 function 中通过源文件创建的标量变量在全局 scope 中创建
  • 但是在 function 中通过源文件创建的数组变量是在本地scope 中创建的,并且导出它不会改变这一点

委婉地说,这似乎不一致:有什么方法可以解决这种行为吗?

正如评论中所指出的,在 bash 的“最新”版本中,这不再是问题。 对于 4.3 及以下版本,我们发现以下内容:

首先,作业是否在源脚本中无关紧要; function 有所作为。 但是,单独的 function 也不会导致您的问题。 只有 function + export的组合导致数组是本地的。

如果您删除作业前的export ,一切正常。 在您的示例中,您无论如何都不必导出变量。 实际上,没有办法导出数组,因为 posix 中没有指定 arrays。

如果要创建全局变量并将其导出,请使用declare -xg而不是export

#!/usr/bin/env bash

function sourcefile(){
  source /tmp/srcfile
  echo "Sourced array in func: ${sourcedarray[*]}"
  echo "Sourced scalar in func: ${sourcedscalar}"
}

globalarray=([0]="xyzzy" [1]="kaboom")
globalscalar="argle"

cat >/tmp/srcfile <<EOF
declare -xg sourcedscalar="bargle"
# whether or not you use `-x` makes no difference for the environment
declare -xga sourcedarray=([0]="foo" [1]="bar")
EOF

sourcefile

echo "Global array: ${globalarray[*]}"
echo "Global scalar: ${globalscalar}"
echo "Sourced array: ${sourcedarray[*]}"
echo "Sourced scalar: ${sourcedscalar}"

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM