gpt4 book ai didi

Bash 数组导出?

转载 作者:行者123 更新时间:2023-11-29 08:57:20 25 4
gpt4 key购买 nike

是否可以申报和导出 来自函数中单个语句的数组?

我目前的解决方法是先声明,然后导出。

f() { foo=(1 2 3); export foo; }; f; export -p | grep foo=
declare -ax foo='([0]="1" [1]="2" [2]="3")'

我观察到:

f() { export bar=(1 2 3); }; f; export -p | grep bar=
<no output>

和:

f() { export baz="(1 2 3)"; }; f; export -p | grep baz=
declare -x baz="(1 2 3)" # not an array

我使用 v3.2.48(1)-release 无法升级


一些背景:

我有一个 friend ,我想和他一起研究“一些”Django。

他在命令行方面比我更无能,需要在 OSX hackintosh 上执行以下操作:

  • 启动交互式 shell
  • 根据我的规范找到包括 django bin 目录在内的 PATH 变量
  • 找到更新的 PYTHONPATH env var,其中可见各种 django 库
  • 一个很好的交互式 ipython shell,可以在双击后开始输入命令
  • (棘手)一个交互式 shell,一旦他 CTRL-D 从 ipython 退出就回退

在 Windows 上,我会为命令快捷方式设置别名,例如 cmd.exe,设置自定义环境变量并启动 ipython。这行得通:退出 ipython 后,您仍然发现自己处于命令解释器中。

这在 OSX 的标准 bash 中完全可行吗?我玩过 bash -c,但很多东西都不起作用,比如切换到目录、能够退出 python 并留在终端中等。也玩过 -s。

最佳答案

您不能在 Bash(或任何其他 shell)中导出数组。 Bash 从不将数组导出到环境中(直到有一天可能实现,请参阅联机帮助页中的错误部分)。

这里发生了几件事。同样,在数组上设置 -x 属性是荒谬的,因为它实际上不会被导出。您看到这些结果的唯一原因是因为您在本地化数组之前定义了它,导致它下降到下一个最外层的范围,在该范围中该名称已成为本地(或全局范围) ).

所以要明确一点,只要你使用声明命令,你总是在创建一个局部的,除非你使用 exportreadonly 作为非数组赋值一个参数,因为它们是 POSIX,它既不指定局部变量也不指定数组。

function f {
typeset -a a # "a" is now local to "f"
g
printf 'Now back in "f": %s\n' "$(typeset -p a)"
}

function g {
a=(1 2 3) # Assigning f's localized "a"
typeset -a a # A new local a
printf 'In "g": %s\n' "$(typeset -p a)" # g's local is now empty.
a=(a b c) # Now set g's local to a new value.
printf 'Still in "g": %s\n' "$(typeset -p a)"
}

f

# In "g": declare -a a='()'
# Still in "g": declare -a a='([0]="a" [1]="b" [2]="c")'
# Now back in "f": declare -a a='([0]="1" [1]="2" [2]="3")'

似乎如果你给一个数组作为 export 的参数,那么 Bash 会像任何其他声明命令一样使它成为本地的。基本上不要使用 export 来定义数组。 export 是一个 POSIX 内置函数,它的行为对于数组是未定义的,这可能就是为什么 bash 只是把它当作你使用过 typeset -ax a=(1 2 3) .使用 typesetlocaldeclare。真的没有办法知道什么是“正确的”,甚至无法与其他 shell 进行比较。 ksh93 是唯一一个接受数组赋值作为声明命令参数的,它的行为与 Bash 不一致。

要了解的重要一点是环境与它无关,当您尝试使用仅限 POSIX 的命令执行非标准操作时,您只是在玩弄本地人的怪癖。

为了真正得到你想要的效果,你可以使用typeset -p

function f {
typeset -a "${1}=(1 2 3)"
typeset -p "$1"
}

typeset -a arr
eval "$(f arr)"
typeset -p arr

Bash 保证你会得到正确的结果,但我发现这不是很有用并且很少使用这种方法。通常最好让调用者定义一个本地范围并使用动态作用域来完成工作(正如您已经发现的那样......只需在不导出的情况下完成)。

在 Bash 4.3 中,您可以使用 typeset -n,这确实是处理此问题的最正确方法。

关于Bash 数组导出?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15825353/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com