我正在编写一个应该在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.mac
或Makefile.linux
,但我宁愿避免这种情况。
安全的方法是不使用 sed
的-i
选项。此选项是一个不可移植的扩展,不是 POSIX 的一部分。
通过使用如下代码,可以完全避免使用该-i
:
sed 's/foo/bar/' file > tmp && mv tmp file
然后它会将数据写入 tmp 文件> tmp
如果没有发生错误&&
则将 tmp 文件移回原始file
您将在短时间内获得一个临时文件。
我不确定这是否会比-i
选项慢。