bash在脚本命令之前设置环境变量

时间:2018-02-04 21:57:59

标签: bash shell makefile environment-variables gnu-make

我用以下代码编译我的项目:

debug=yes make -j4debug=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脚本中的命令?

由于

3 个答案:

答案 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)变量设置放在命令的开头,即“守护程序”之前。