我需要能够拆分一个字符串,以便每个字符串在我的 shell 中作为变量传递。
我尝试了这样的事情:
$ cat test.sh
#!/bin/sh
COMPOPT="CC=clang CXX=clang++"
$COMPOPT cmake ../gdcm
我也尝试了一个特定于 bash 的解决方案,但到目前为止没有运气:
$ cat test.sh
#!/bin/bash -x
COMPOPT="CC=clang CXX=clang++"
ARRAY=($COMPOPT)
"${ARRAY[0]}" "${ARRAY[1]}" cmake ../gdcm
我总是收到非信息性错误消息:
./test.sh: 5: ./t.sh: CC=clang: not found
当然,如果我直接从正在运行的外壳尝试,则可以
:$ CC=clang CXX=clang++ cmake ../gdcm
另一个无eval
的解决方案是使用 env
程序:
env "${ARRAY[@]}" cmake ../gdm
它为通常的FOO=BAR command
语法提供了间接级别。
当你说:
$COMPOPT cmake ../gdcm
命令行管理程序将尝试将变量的值作为命令执行。
在这种情况下,邪恶eval
相当方便。 说:
eval $COMPOPT cmake ../gdcm
虽然 devnull 的答案有效,但使用了eval
,这已经知道陷阱了。
这是一种无需调用eval
即可完成的方法:
#!/bin/sh
COMPOPT="CC=clang CXX=clang++"
sh -c "$COMPOPT cmake ../gdcm"
即将整个命令行传递给sh
(或 bash)。