[英]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.mac
或Makefile.linux
,但是我宁愿避免这种情况。
安全的方法是不使用sed
的-i
选项。 此选项是不可移植的扩展,不是POSIX的一部分。
您可以通过使用如下代码完全避免使用-i
:
sed 's/foo/bar/' file > tmp && mv tmp file
然后它将数据写入tmp文件> tmp
如果未发生错误&&
将tmp文件移回原始file
您将在短时间内获得一个临时文件。
我不确定这是否会比-i
选项慢。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.