为什么/ bin / sh在Mac和Ubuntu上表现不同

时间:2013-11-13 01:53:34

标签: macos bash shell ubuntu sh

我正在写一个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)

  3. 我的问题是:

    1. 为什么/ bin / sh在Mac和Ubuntu上表现不同?
    2. 如果我想编写跨平台的sh脚本,我应该如何避免与平台相关的代码?

2 个答案:

答案 0 :(得分:6)

我的问题是:
  1为什么/ bin / sh在Mac和Ubuntu上的行为有所不同?

因为它们都是不同的贝壳。 sh on ubuntu是破折号外壳,sh on minix是灰壳,sh on slackware是bash shell。而且,因为OSX也不是太长了bash shell

如果你想要相同的行为,请指定你的shell ...#!/ bin / sh虽然严格来说是永远在free-systems-implemented-bourne-shell,但一般来说系统shell可能因系统而异系统...使用#!/ bin / bash字面上说你的意思是bash,使用#!/ bin / ksh直接调用korn-shell等。

2如果我想编写cross-platforma sh脚本,我应该如何避免与平台相关的代码?

1)正式:严格遵守POSIX规则,以便在任何符合POSIX标准的shell上运行

2)实用:针对几乎所有系统都可用的一种shell特定的写入(不包括微控制器和SoC或大型铁杆和sparc站,    bash适用于大多数系统,但是有系统不做bash所以bash不是100%可移植性的最佳选择,但它绝对是最常用的(ab); - )

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

4)最重要的是: user2719058 是对的,OSX不是Linux而是BSD-UNIX,所以虽然它们可以运行相同的shell,但命令却不同,使得编写起来非常困难一个脚本适合所有人。选择最好的shell不会改变那个......因此,除非每个系统上的系统命令都符合POSIX标准,否则统一脚本语言的价值将被证明是非常有限的。

<强> TL; DR:
统一的跨平台脚​​本是一个梦想,因为跨系统的二进制文件的差异阻止了这一点。

答案 1 :(得分:5)

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

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