在 Makefile 中在 linux 和 MacOS 上使用 sed

sed on linux and MacOS in Makefile

我正在编写一个应该在 Linux 和 MacOS 系统上工作的 Makefile。我使用 sed 程序。 事实证明,BSD sed 和 gnu sed 在一个很小但很关键的细节上有所不同。我从手册页中引用:

BSD:
-i extension ...

GNU:
-i[SUFFIX], --in-place[=SUFFIX]

所以在 Mac 我必须打电话给

sed -i '' -e 's/foo/bar/' file.tmp

-i 之后的空字符串是必需的,而在 Linux 机器上我调用

sed -i 's/foo/bar/' file.tmp

这里是问题:

有没有安全的方法来区分 Makefile 中的两个 OS?

我当然可以让用户调用 Makefile.macMakefile.linux,但我宁愿避免这种情况。

安全的方法是不使用 sed-i 选项。此选项是不可移植的扩展,不是 POSIX.

的一部分

您可以通过使用如下代码完全避免使用 -i

sed 's/foo/bar/' file > tmp && mv tmp file

然后它将数据写入一个tmp文件> tmp
如果没有错误发生 && 将 tmp 文件移回原始 file

您将在短时间内获得一个临时文件。
我不确定这是否会比 -i 选项慢。