【问题标题】:sed on linux and MacOS in Makefilesed 在 Makefile 中的 linux 和 MacOS 上
【发布时间】:2015-05-18 15:42:13
【问题描述】:

我正在编写一个可以在 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 中的两个操作系统?

我当然可以让用户致电Makefile.macMakefile.linux,但我宁愿避免这种情况。

【问题讨论】:

  • 功能测试sed 命令?运行sed -i ext 's///' <<<input 之类的东西,看看它是成功还是错误?我相信这应该在 bsd sed 上成功而在 GNU sed 上失败。

标签: linux macos sed makefile bsd


【解决方案1】:

安全的方法是不使用sed-i 选项。此选项是不可移植的扩展,不是 POSIX 的一部分。

【讨论】:

  • 每天都在学习一些东西...所以我想没有办法绕过临时文件...
  • 您也可以尝试更改您的脚本,以便sed 按预期过滤传入的数据。如果不查看更多 Makefile(提示提示),很难说最好的主意是什么。
【解决方案2】:

您可以通过使用如下代码完全避免使用-i

sed 's/foo/bar/' file > tmp && mv tmp file

然后它将数据写入 tmp 文件> tmp
如果没有错误发生 && 将 tmp 文件移回原始 file

您将在短时间内获得一个临时文件。
我不确定这是否会比-i 选项慢。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 2011-02-20
    • 1970-01-01
    • 2012-08-29
    • 2018-12-16
    相关资源
    最近更新 更多