linux - 在 Makefile 中自定义 SHELL (set SHELL=my_shell.sh)

标签 linux bash shell makefile

我想为 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/

相关文章:

c - execvp 导致内存问题

php - svn 从 php 文件更新

Linux如何在脚本中查找所有可执行文件

c - 如何在64位机器下将libxml2和libcurl编译成32位?

c - 当我使用 stdio.h、conio.h 时链接了哪个库

python - 如何将输出数据排序为列和行

linux - 无法通过 SSH 在远程服务器上安装 Dropbox

linux - 如何将文本文件中杂乱的内容排序成单列

shell - 在 shell 函数中 cat 一个文件

linux - 转义 linux shell 参数