我想执行这样的命令:“ LD_PRELOAD=/path/to/my/so ./a.out
”
所以我写了一个shell脚本:
cmd="LD_PRELOAD=/path/to/my/so ./a.out"
${cmd}
发生了错误:
LD_PRELOAD=/path/to/my/so : no such file or directory
顺便说一句,该文件/path/to/my/so
存在,我可以在 bash 中成功执行命令。
哪里不对了?
在你的脚本中做这样的事情会更传统:
export LD_PRELOAD=whatever
./a.out
It's looking for an executable called LD_PRELOAD=/path/to/my/so
in your path and can't find it. You can use eval
to get around this:
eval $CMD
Or, equivalently:
bash -c "$CMD"
是的。
bash 命令处理有几个阶段。在第一阶段,变量分配和重定向被识别并留作进一步处理。然后将命令的其余部分传递到第二阶段。变量扩展以及其他事情发生在那个阶段。
第二阶段产生的类似单词FOO=bar
不再被解释为变量赋值。
如果您想将带有变量分配和/或重定向的命令压缩成一个单词,我建议您编写一个函数。