我有一行Makefile,它引发以下错误:Makefile:1: *** missing separator. Stop
。我知道dozens of duplicate questions也有相同的错误消息,但大多数都建议使用不使用制表符或神秘的特殊字符。
$ cat -e -v -t Makefile
set -e$
$ make
Makefile:1: *** missing separator. Stop.
据我所见,没有神秘的特殊人物。也许有一些cat -e -v -t
没有显示的字符?
下面是工作的,所以我猜这不是我的make
安装的问题:
$ cat -v -e -t Makefile
foo:$
^Iecho "Foo"$
$ make
echo "Foo"
Foo
一些相关版本和shell信息。
$ make --version
GNU Make 3.81
$ echo $0
-bash
编辑:见@AProgrammer的评论
注意,不管在set -e
下面有什么,它都会抛出相同的错误消息。
$ cat -e -v -t Makefile
set -e$
$
foo:$
^Iecho "foo"$
$ make
Makefile:1: *** missing separator. Stop.
编辑2:
注添加#!/bin/bash
会引发相同的错误消息。
$ cat -e -v -t Makefile
#!/bin/bash$
set -e$
$
foo:$
^Iecho "foo"$
$ make
Makefile:2: *** missing separator. Stop.
编辑3:
在我的shell上直接运行set -e
似乎有效(它按预期退出失败的make
调用)。
$ set -e
$ make
Makefile:2: *** missing separator. Stop.
Saving session...completed.
Deleting expired sessions...11 completed.
[Process completed]
发布于 2019-12-17 15:43:52
make
绝对没有理由能够解释规则之外的任意shell命令。
如果您想在出现错误时立即退出规则,有几种方法可以实现,或多或少都是可移植的。
首先,规则中的每一行都由shell的单独实例执行。这意味着,如果不手动合并它们(与\
和;
合并),那么如果每行只有一个命令,就会得到所需的行为。
然后,您可以使用set -e
作为可能需要它的少数规则的一部分。例如;
foo:
set -e; for i in a b c d; mkdir $$i; done
使用GNU,您可以更改用于调用shell的标志,另外还可以传递-e
.SHELLFLAGS=-ec
使用POSIX Make,您可以更改shell。我不知道是否支持传递一个标志,但是GNU Make似乎是这样的:
SHELL=/bin/sh -e
但是,始终可以传递一个包装器,该包装器可以按需要设置标志:
SHELL=/path/to/mywrapper
与mywrapper
在一起
#!/bin/sh
exec /bin/sh -e "$@"
https://stackoverflow.com/questions/59376937
复制相似问题