我用以下代码编译我的项目:
debug=yes make -j4
或debug=no make -j4
调试变量更改Makefile中的一些编译器标志
我没有在shell中重复输入,而是编写了这个脚本(让我们称之为daemon
):
#!/bin/bash
inotifywait -q -m -e close_write `ls *.c* *.h*` |
while read; do
make -j4
done
所以我只做./daemon
,它会在写入文件时自动构建。
但是,我希望能够将debug=no make -j4
传递给./daemon
脚本,如下所示:
./daemon debug=no make -j4
所以我修改了脚本:
#!/bin/bash
if [ $# -lt 1 ]; then
echo "Usage `basename $0` [COMMAND]"
exit 1;
fi
inotifywait -q -m -e close_write `ls *.c* *.h*` |
while read; do
"$@"
done
这适用于./daemon make -j4
,但当我说daemon debug=no make -j4
时,我收到以下错误:
./守护程序:第9行:debug = no:未找到命令
如何才能将debug=no
识别为变量而不是daemon
脚本中的命令?
由于
答案 0 :(得分:1)
在识别出任何预命令分配后,"$@"
的扩展将被解析。您需要做的就是确保debug=...
位于运行make
的命令的环境中,这是您的daemon
脚本。
debug=no ./daemon make -j4
答案 1 :(得分:1)
变量扩展只会成为参数(包括第0个参数:命令名)。
他们永远不会成为:
var='> file'; cmd $var
var='&'; mydaemon $var
var='debug=yes'; $var make
&&/||
,转义序列或其他任何内容。如果你想这样做,那么你很幸运:有一个标准的POSIX工具可以将领先的key=value
对变成环境变量并运行你想要的程序。
它被称为env
。这是一个例子:
run() {
env "$@"
}
run debug=yes make -j 4
虽然TBH我使用chepner's solution
答案 2 :(得分:0)
您始终需要将(env)变量设置放在命令的开头,即“守护程序”之前。