繁体   English   中英

在Makefile中自定义SHELL(设置SHELL = my_shell.sh)

[英]Customize SHELL in Makefile (set SHELL=my_shell.sh)

我想为Makefile自定义外壳程序,但是我遇到了麻烦。 这是MWE。 我有一个Makefile,

SHELL=./my_shell.sh

all: abc def

abc:
        touch abc

def:
        touch def

clean:
        rm -f abc def

还有一个简单的自定义脚本my_shell.sh

#!/bin/bash
eval $*

我确保事先运行chmod +x my_shell.sh 然后,当我输入make ,出现错误。

make[3]: Entering directory `<CONFIDENTIAL>'
touch abc
./my_shell.sh: line 2: eval: -c: invalid option
eval: usage: eval [arg ...]
make[3]: *** [abc] Error 2
make[3]: Leaving directory `<CONFIDENTIAL>`

我一直在努力摆脱-c选项。 设置.SHELLFLAGS=''似乎无效。

首先,如果要将make变量设置为空使用

.SHELLFLAGS =

通过添加引号,您实际上已经将变量设置为文字字符串'' (make不是shell,也不会进行shell引号剥离)。

其次, .SHELLFLAGS变量是在GNU make 3.82中添加的,因此,如果您的版本比该版本旧,则它将不起作用。 如果您拥有3.82或更高版本,那么它确实可以工作(我刚刚尝试过)。

最后,正如让·弗朗索瓦(Jean-François)指出的那样,如果您的命令转义了空格,您将遇到问题。 但是,他使用"$@"解决方案无法按原样工作,因为这样,整个命令就被视为一个字符串。

该脚本的更可靠实现是:

#!/bin/bash
exec /bin/bash "$@"

然后不要修改.SHELLFLAGS 否则,请将.SHELLFLAGS设置为空并创建脚本:

#!/bin/bash
exec /bin/bash -c "$@"

SHELL需要shell命令,例如bashcsh make使用-c作为第一个参数(命令选项)来调用shell命令。

由于您将所有参数直接传递给eval命令,因此会出现该错误。

使用shift跳过不使用的第一个-c参数。

#!/bin/bash
shift
eval $*

如果参数中有空格,则可能需要使用"$@"而不是$*

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM