1
$ foo='A="1 2" B=3' sh -c 'ruby -e "p ARGV" $foo'
["A=\"1", "2\"", "B=3"]

代わりにどうすれば入手でき["A=1 2", "B=3"]ますか?

そんなこと知ってる:

sh -c 'ruby -e "p ARGV" A="1 2" B=3'
["A=1 2", "B=3"]

fooしかし、私の本当の問題はJenkinsジョブの「シェル実行プロセス」にあるため、変数が必要です。

編集:同じシェルで配列を使用する

$ foo=(A="1 2" B=3) && ruby -e "p ARGV" $foo
["A=1 2", "B=3"]

ただし、配列を環境変数として伝播することはできません。

$ foo=(A="1 2" B=3) sh -c 'ruby -e "p ARGV" $foo'
[]
4

5 に答える 5

3

適切な引用の欠如によって引き起こされた溝を埋めるために、スペースから逃れる必要があります。

foo='A="1\ 2" B=3' sh -c 'ruby -e "p ARGV" $foo'

これは基本的に、「やってはいけないこと」の質問の変形です。http://mywiki.wooledge.org/BashFAQ/050

于 2012-12-26T09:20:11.103 に答える
2

Jenkins にはまさにこの問題がありました。いえ

./ourScript.py "${args}"

引用符にもかかわらず、スペースで引数が壊れていました。

で修正しました

eval "./ourScript.py '${args}'"

于 2016-06-03T12:38:55.200 に答える
1

A=1 2私の理解では、2 つの追加パラメーターを ruby​​ (および)に送信したいB=3が、1 つの変数 ( foo) 内に送信したいということです。これは、最初のパラメーターのスペースがサブシェルによる単語分割に使用されるため、単純ではありません。解決策は、単語分割に別の文字を使用するようにサブシェルに指示することです (私は以下を使用しています_)。したがって、スクリプトは次のようになります。

foo="A=1 2_B=3" sh -c 'IFS=_; ruby -e "p ARGV" $foo'

パラメータに可能な文字を残したい場合は_、代わりに単語分割に改行を使用できますが、読みにくくなります。

foo="A=1 2
B=3" sh -c 'IFS="
"; ruby -e "p ARGV" $foo'
于 2012-12-26T17:03:39.683 に答える
0
sh -s 'A=1 2' B=3 <<\EOF
export "$@"
python3 -c 'import os; print("\n".join(os.environ[x] for x in ["A", "B"]))' "$foo"
EOF

これには、リリースされていない POSIX-2008 TC1/bin/shで指定されている宣言コマンドの動作をサポートする必要があります。export

私はそれを使用しないので、ルビーに変換します。

編集これは意味がありません... argvまたは環境が必要ですか? 環境を介して配列を渡すことはできず、argv を介して名前付き変数を渡すことはできません。

argv については、変数を使用しないでください。文字列を引数としてシェル ラッパーに渡します。

$ sh -c $'python3 -c \'import sys; print("\\n".join(sys.argv[1:]))\' "$@"' _ 'A=1 2' B=3
A=1 2
B=3
于 2012-12-26T14:20:14.690 に答える