在 Linux 和 MacOS 上的 sed 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/' 文件.tmp

问题是:

有没有一种安全的方法来区分生成文件中的两个操作系统?

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

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

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

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

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

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

最新更新