我想要一个执行命令的函数(例如make
)和该函数的一个参数可以是多个的字符串该命令的参数。
这是一个失败的脚本示例,它演示了我想要实现的目标:
#!/bin/sh
set -e
set -u
set -v
set -x
buildSomething() {
make ${1}
}
buildSomething "CFLAGS=\"-DX=1 -DY=1\" CXXFLAGS=\"-DXX=11 -DYY=11\" -j$(nproc)"
这会失败,因为shell决定再次引用参数:
buildSomething "CFLAGS=\"-DX=1 -DY=1\" CXXFLAGS=\"-DXX=11 -DYY=11\" -j$(nproc)"
nproc
++ nproc
+ buildSomething 'CFLAGS="-DX=1 -DY=1" CXXFLAGS="-DXX=11 -DYY=11" -j8'
+ make 'CFLAGS="-DX=1' '-DY=1"' 'CXXFLAGS="-DXX=11' '-DYY=11"' -j8
make: invalid option -- 'D'
make: invalid option -- 'Y'
make: invalid option -- '='
make: invalid option -- '1'
make: invalid option -- '"'
make: invalid option -- 'D'
make: invalid option -- 'Y'
make: invalid option -- 'Y'
make: invalid option -- '='
make: invalid option -- '1'
make: invalid option -- '1'
make: invalid option -- '"'
我知道问题在于引用,但我想我已经尝试了所有我能想到的组合......这个问题有没有通用的解决方案?我并不坚持修复上面这个确切的脚本,一个不同的方法可以让我做第一段中提到的事情也没关系。因为这样的函数会有多个命令,每个命令都可以在函数的不同参数中使用它的参数,对于一个函数中的每个命令都有多个参数非常重要参数(或等价物)。
答案 0 :(得分:1)
#!/bin/sh
buildSomething() {
eval "make ${1}"
}
buildSomething 'CFLAGS=\"-DX=1 -DY=1\" CXXFLAGS=\"-DXX=11 -DYY=11\"'" -j$(nproc)"
答案 1 :(得分:0)
我认为这可能是一种更安全的方式:
#!/bin/sh
buildSomething() {
echo ${1} | xargs make
}
buildSomething 'CFLAGS=\"-DX=1 -DY=1\" CXXFLAGS=\"-DXX=11 -DYY=11\"'" -j$(nproc)"