1

一部のシェル スクリプト (特に ZSH) で、シェルがスペースを含むエクスポートを理解できないという問題があるようです。この問題は、「ru​​nco​​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 個のエスケープを追加すると、エラー メッセージが に変わる場合がありますexport:4: not valid in this context: b\

誰が問題が何であるかについての洞察を持っているでしょうか? ありがとうございました。

(私がこれを行っている理由は、Python が .myshellrc で実行されるコードを動的に生成することによってシェル変数を設定できるようにするためのハックです。誰かがこれを行うためのよりエレガントな方法を知っている場合は、コメントとして大歓迎です。ありがとう)編集:明確にするために、上記を機能させる方法、または外部スクリプトが何をエクスポートするかを指示できるようにする別の方法を探しています。

(*ため息*、これが 4.3.12 のバージョン固有の問題でないことを願っています...これは過去に機能していた可能性があると思います。)

4

3 に答える 3

3

ここでの問題は、コマンドとして実行される前に、出力に対して作業分割が行われることです。最終的には、 、、およびのexport3 つの引数で呼び出されます。test1="abc"

eval他の回答が述べたように使用することは、それを回避する1つの方法です。

別の解決策は、プロセス置換を使用することです。これは、スクリプトが複数行のコードを生成する場合に特に便利です。

例:

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

ps bashでも機能するようにする<(...)代わりに、構文を使用することをお勧めします。=(...)

于 2012-04-20T12:21:43.753 に答える
2

これを行う通常の方法はeval、kevが言ったように使用し、問題のプログラムの完全な出力を渡すことです。次に、プログラムは有効なシェルコード自体を生成する必要があります。

eval "$(your_script.py)"

そして、次のyour_script.pyようexport var1="a b c"に出力します(はい、出力で括弧を使用しても問題ありません)。

この手法を使用するプログラムの例はrbenvです。ユーザーはeval "$(rbenv init -)"自分のシェルinitファイルを挿入する必要があり、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 に答える
2

これを見てください。あなたが試すことができます:

eval 'export test2="a b c"'
于 2012-04-20T12:06:17.580 に答える