在 Makefile 中在 linux 和 MacOS 上使用 sed
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
选项慢。
我正在编写一个应该在 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
选项慢。