首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么我得到"Makefile:1:*缺少分隔符,停止。“用"set -e"?

为什么我得到"Makefile:1:*缺少分隔符,停止。“用"set -e"?
EN

Stack Overflow用户
提问于 2019-12-17 15:02:03
回答 1查看 649关注 0票数 1

我有一行Makefile,它引发以下错误:Makefile:1: *** missing separator. Stop。我知道dozens of duplicate questions也有相同的错误消息,但大多数都建议使用不使用制表符或神秘的特殊字符。

代码语言:javascript
运行
复制
$ cat -e -v -t Makefile 
set -e$

$ make
Makefile:1: *** missing separator.  Stop.

据我所见,没有神秘的特殊人物。也许有一些cat -e -v -t没有显示的字符?

下面是工作的,所以我猜这不是我的make安装的问题:

代码语言:javascript
运行
复制
$ cat -v -e -t Makefile 
foo:$
^Iecho "Foo"$

$ make
echo "Foo"
Foo

一些相关版本和shell信息。

代码语言:javascript
运行
复制
$ make --version
GNU Make 3.81

$ echo $0
-bash

编辑:见@AProgrammer的评论

注意,不管在set -e下面有什么,它都会抛出相同的错误消息。

代码语言:javascript
运行
复制
$ cat -e -v -t Makefile 
set -e$
$
foo:$
^Iecho "foo"$

$ make
Makefile:1: *** missing separator.  Stop.

编辑2:

注添加#!/bin/bash会引发相同的错误消息。

代码语言:javascript
运行
复制
$ cat -e -v -t Makefile 
#!/bin/bash$
set -e$
$
foo:$
^Iecho "foo"$

$ make
Makefile:2: *** missing separator.  Stop.

编辑3:

在我的shell上直接运行set -e似乎有效(它按预期退出失败的make调用)。

代码语言:javascript
运行
复制
$ set -e
$ make
Makefile:2: *** missing separator.  Stop.
Saving session...completed.
Deleting expired sessions...11 completed.

[Process completed]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-17 15:43:52

make绝对没有理由能够解释规则之外的任意shell命令。

如果您想在出现错误时立即退出规则,有几种方法可以实现,或多或少都是可移植的。

首先,规则中的每一行都由shell的单独实例执行。这意味着,如果不手动合并它们(与\;合并),那么如果每行只有一个命令,就会得到所需的行为。

然后,您可以使用set -e作为可能需要它的少数规则的一部分。例如;

代码语言:javascript
运行
复制
foo:
        set -e; for i in a b c d; mkdir $$i; done

使用GNU,您可以更改用于调用shell的标志,另外还可以传递-e

代码语言:javascript
运行
复制
.SHELLFLAGS=-ec

使用POSIX Make,您可以更改shell。我不知道是否支持传递一个标志,但是GNU Make似乎是这样的:

代码语言:javascript
运行
复制
SHELL=/bin/sh -e

但是,始终可以传递一个包装器,该包装器可以按需要设置标志:

代码语言:javascript
运行
复制
SHELL=/path/to/mywrapper

mywrapper在一起

代码语言:javascript
运行
复制
#!/bin/sh
exec /bin/sh -e "$@"
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59376937

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档