【问题标题】:Why does /bin/sh behave differently on Mac and Ubuntu为什么 /bin/sh 在 Mac 和 Ubuntu 上的行为不同
【发布时间】:2013-11-25 11:07:00
【问题描述】:

我正在编写一个 sh 文件来获取文件的修改时间。我希望 sh 文件适用于 Mac 和 Ubuntu。

我使用 /bin/sh 并将 #!/bin/sh 添加到 bash 文件的第一行。我想 /bin/sh 在两个操作系统上的行为应该相同。但事实并非如此。以下是差异的两个示例。

  1. 以下脚本适用于 Mac,但不适用于 Ubuntu。

    modTime=$(stat -f "%m" -t "%s" $filepath)

  2. 下面的脚本适用于 Ubuntu,但不适用于 Mac。

    modTime=$(date +%s -r $filepath)

我的问题是:

  1. 为什么 /bin/sh 在 Mac 和 Ubuntu 上的行为不同?
  2. 如果要写跨平台的sh脚本,应该如何避免平台依赖的代码?

【问题讨论】:

    标签: macos bash shell ubuntu sh


    【解决方案1】:

    这不是 shell 的行为不同,而是您正在运行的命令。在 Ubuntu 上,这些来自 GNU 世界,在 MacOS 上,它们可能是一些 BSD 变体。这通常意味着,在 MacOS 上你的功能更少。 :)

    应该注意,这(我猜)也适用于/bin/sh,但这不是您看到的破损的原因。

    【讨论】:

      【解决方案2】:
      1. 为什么 /bin/sh 在 Mac 和 Ubuntu 上的行为不同?

      因为它们都是不同的外壳。 ubuntu 上的 sh 是 dash shell,minix 上的 sh 是 ash shell,slackware 上的 sh 是 bash shell。而且由于 OSX 上的 sh 也不是太长的 bash shell

      如果您想要相同的行为,请指定您的 shell...#!/bin/sh 虽然严格来说是 never-in-free-systems-implemented-bourne-shell,但通常是系统 shell,它可能因系统而异system ...使用 #!/bin/bash 字面意思是说你的意思是 bash,使用 #!/bin/ksh 字面意思是调用 korn-shell 等。

      1. 如果要写跨平台的a sh脚本,应该如何避免平台依赖的代码?
      1. 正式:严格遵守 POSIX 规则,以便在任何符合 POSIX 的 shell 上运行

      2. 务实地:针对几乎任何系统上可用的一种外壳(不包括微控制器和 SoC 或大熨斗和 sparc 站, bash 可用于大多数系统,但是有些系统不使用 bash,因此 bash 不是 100% 可移植性的最佳选择,但它绝对是(ab)使用最多的;-)

      3. 最佳便携性:作为 Ubuntu 用户的经验法则:如果它在 dash(ubuntu 的 /bin/sh)上运行,它几乎可以在任何东西上运行(包括您的路由器、烤面包机和咖啡机)。

      4. 最重要的是:user2719058 是对的,OSX 不是 Linux 而是 BSD-UNIX,因此虽然它们可以运行相同的 shell,但命令的不同足以使其非常难以写一个万能的。选择最好的 shell 不会改变这一点......因此,除非每个系统上的系统命令也符合 POSIX,否则统一脚本语言的价值被证明是非常有限的。

      tl;博士:
      统一的跨平台脚​​本是白日梦,因为跨系统二进制文件的差异阻止了这一点。

      【讨论】:

      • 在 OSX 和 Linux 之间可接受的跨脚本的唯一方法是将偏离的外部命令包装在函数调用中,然后将其存储在可以在主脚本中获取的文件中
      • POSIX 还为许多常见二进制文件指定了一个接口,尽管缺少一些有用的(例如,stat),而其他的(例如,find)与扩展相比非常有限例如,由 GNU 提供,以使坚持标准令人厌烦,充其量。
      猜你喜欢
      • 2014-12-30
      • 2018-06-01
      • 2016-04-12
      • 2015-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-07
      • 1970-01-01
      相关资源
      最近更新 更多