在Makefile中基于linux和MacOS的sed
我正在写一个Makefile,它应该可以在Linux和MacOS系统上工作。我使用sed程序。 事实证明,BSD sed和gnu sed在一个小而关键的细节上有所不同。我从手册中引用:在Makefile中基于linux和MacOS的sed,linux,macos,sed,makefile,bsd,Linux,Macos,Sed,Makefile,Bsd,我正在写一个Makefile,它应该可以在Linux和MacOS系统上工作。我使用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/
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中的两个操作系统
当然,我可以让用户调用Makefile.mac或Makefile.linux,但我宁愿避免这种情况。安全的方法是不使用sed的-I选项。此选项是不可移植的扩展,不是POSIX的一部分。安全的方法是不使用sed的-i选项。此选项是一个不可移植的扩展,不是POSIX的一部分。通过使用以下代码,您可以完全避免使用-i:
sed 's/foo/bar/' file > tmp && mv tmp file
然后将数据写入tmp文件>tmp
如果没有发生错误&&将tmp文件移回原始文件
您将在短时间内获得一个临时文件。
我不确定这是否会比-I选项慢。您可以通过使用以下代码完全避免使用-I:
sed 's/foo/bar/' file > tmp && mv tmp file
然后将数据写入tmp文件>tmp
如果没有发生错误&&将tmp文件移回原始文件
您将在短时间内获得一个临时文件。
我不确定这是否会比-I选项慢。功能测试sed命令?运行sed-i ext的///'功能测试sed命令?运行sed-i ext的///“每天学习一些东西。。。所以我想暂时文件是没有办法的……您也可以尝试更改脚本,以便sed按预期过滤传入的数据。很难说最好的主意是什么,除非看到更多的Makefile提示。每天学习一些东西。。。所以我想暂时文件是没有办法的……您也可以尝试更改脚本,以便sed按预期过滤传入的数据。如果看不到更多的Makefile提示,很难说什么是最好的主意。