1

我似乎遇到了一些 shell 脚本(尤其是 ZSH)的问题,其中 shell 无法理解带有空格的导出。该问题仅在使用 `runco​​mmand` 或 $(runco​​mmand) 时发生。

测试用例:

# Works fine:
export test1="a b c"

# Does not work:
$(echo 'export test2="a b c"')

该错误类似于export:4: not valid in this context: c". 在空格和/或引号之前添加 1-2 \-escapes 可能会将错误消息更改为export:4: not valid in this context: b\.

可能有人能洞察问题是什么?谢谢你。

(我这样做的原因是允许python通过动态生成在.myshellrc中运行的代码来设置shell变量;如果有人知道更优雅的方法来做到这一点,那将非常欢迎作为评论。谢谢你。)编辑:为了澄清,我正在寻找一种方法来完成上述工作,或者另一种方法来允许外部脚本决定要导出的内容。

(*叹气*,我希望这不是 4.3.12 中特定于版本的问题......我认为这在过去可能有效。)

4

3 回答 3

3

这里的问题是工作拆分是在作为命令运行之前对输出进行的。你最终得到的是export用 3 个参数调用 - test1="a,bc".

eval正如其他答案所提到的那样,使用它是解决它的一种方法。

另一种解决方案是使用流程替换。如果您的脚本正在生成多行代码,这将特别有用。

例子:

zsh% source =(echo export test1=\"a b c\")
zsh% echo $test1                          
a b c

ps 您可能希望使用<(...)语法而不是=(...)允许它在 bash 中工作的语法。

于 2012-04-20T12:21:43.753 回答
2

看看这个。你可以试试:

eval 'export test2="a b c"'
于 2012-04-20T12:06:17.580 回答
2

执行此操作的通常方法是使用evalkev 所说的并将相关程序的完整输出传递给它。然后程序应该自己生成有效的 shell 代码:

eval "$(your_script.py)"

并且your_script.py会打印类似的东西export var1="a b c"(是的,在输出中使用括号是可以的)。

使用这种技术的程序的一个例子是rbenv。用户必须放入eval "$(rbenv init -)"他的 shell 初始化文件,并且rbenv init实际上输出了相当多的代码:

export PATH="/opt/rbenv/shims:${PATH}"
source "/opt/rbenv/libexec/../completions/rbenv.zsh"
rbenv rehash 2>/dev/null
rbenv() {
  local command="$1"
  if [ "$#" -gt 0 ]; then
    shift
  fi

  case "$command" in
  shell)
    eval `rbenv "sh-$command" "$@"`;;
  *)
    command rbenv "$command" "$@";;
  esac
}
于 2012-04-20T12:16:39.537 回答