[英]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命令,例如bash
或csh
。 make
使用-c
作为第一个参数(命令选项)来调用shell命令。
由于您将所有参数直接传递给eval
命令,因此会出现该错误。
使用shift
跳过不使用的第一个-c
参数。
#!/bin/bash
shift
eval $*
如果参数中有空格,则可能需要使用"$@"
而不是$*
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.