我正在编写一个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
,但我宁愿避免这种情况。
答案 0 :(得分:3)
安全的方法是不使用-i
的{{1}}选项。此选项是不可移植的扩展,不属于POSIX。
答案 1 :(得分:2)
您可以使用以下代码完全避免使用-i
:
sed 's/foo/bar/' file > tmp && mv tmp file
然后它会将数据写入tmp文件> tmp
如果没有错误发生&&
将tmp文件移回原始file
您会在短时间内获得临时文件
我不确定这是否会慢于-i
选项。