我想为 Makefile 定制 shell,但我遇到了麻烦。这是一个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 "$@"
关于linux - 在 Makefile 中自定义 SHELL (set SHELL=my_shell.sh),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40203215/