gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:26:55 31 4
gpt4 key购买 nike

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

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com