Bash 4.3.30
假设您有以下代码:
#!/bin/bash
declare -A map
f() {
map[x]=a
map[y]=b
}
g() {
for k in "${!map[@]}"
do
echo "$k --> ${map[$k]}"
done
}
f
g
这输出
x --> a
y --> b
如果我改变上面提到的程序,f | g
它就不会输出任何内容。
我认为在全局范围内声明关联数组将允许我随时随地访问其值。我读过有关管道和范围的奇怪问题,但我一直无法找到解决方案。
答案1
声明变量的位置无关紧要。f
因为它在管道中,所以在单独的进程中运行,因此对它f
所做的任何更改map
都会被隔离到那进程。这种情况下的修复很简单;f
不产生任何输出,因此没有理由使用管道将其连接到g
。只需运行f
,然后 g
。
f; g