$ 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
是必需的,因为我的真正问题在于" shell执行过程"詹金斯的工作。
编辑:在同一个shell中使用数组
$ 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'
[]
答案 0 :(得分:3)
你需要逃离这个空间来弥补因缺乏适当引用而造成的鸿沟。
foo='A="1\ 2" B=3' sh -c 'ruby -e "p ARGV" $foo'
这基本上是“不要那样做”问题的变体。 http://mywiki.wooledge.org/BashFAQ/050
答案 1 :(得分:2)
我们与詹金斯有这个确切的问题。即
./ ourScript.py“$ {args}”
尽管有引号,还是在空间上打破了。
我们用
修复了它eval“./ ourScript.py'$ {args}'”
答案 2 :(得分:1)
我的理解是你要向ruby(A=1 2
和B=3
)发送2个附加参数,但是在单个变量(foo
)内。这并不简单,因为第一个参数中的空格将用于子shell的分词。一个解决方案是告诉子shell使用另一个字符进行分词(我正在使用_
下方)。所以你的脚本变成了:
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'
答案 3 :(得分: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
这要求您的/bin/sh
支持未发布的POSIX-2008 TC1指定的export
的声明命令行为。
转换为红宝石,因为我不使用它。
编辑这没有意义......你想要argv还是环境?您无法通过环境传递数组,也无法通过argv传递命名变量。
对于argv,请勿尝试使用变量。将字符串作为参数传递给shell包装器。
$ sh -c $'python3 -c \'import sys; print("\\n".join(sys.argv[1:]))\' "$@"' _ 'A=1 2' B=3
A=1 2
B=3
答案 4 :(得分:0)
正如我在问题答案中的评论中所提到的,该程序将这些参数(A和B)设为make
。所以,我决定在配方中扩展$(foo)
并调用submake。因为make
按原样扩展变量。
在:
$ foo='A="1 2" B=3' sh -c 'make $foo'
在:
$ foo='A="1 2" B=3' sh -c 'make wrapper'
生成文件:
wrapper:
make $(foo)
这不是我问题的确切答案,而是我选择的解决方案。