Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Makefile中基于linux和MacOS的sed_Linux_Macos_Sed_Makefile_Bsd - Fatal编程技术网

在Makefile中基于linux和MacOS的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/

我正在写一个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/'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提示,很难说什么是最好的主意。