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

标签 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)

我的问题是:

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

最佳答案

  1. Why the /bin/sh behaves differently on on Mac and Ubuntu?

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

如果你想要相同的行为,请指定你的 shell... system ...使用 #!/bin/bash 从字面上说你的意思是 bash,使用 #!/bin/ksh 从字面上调用 korn-shell 等等。

  1. If I want to write the cross-platforma sh script, how should I avoid the platform-dependent code?
  1. 正式:严格遵守 POSIX 规则以在任何 POSIX 兼容的 shell 上运行

  2. 务实地:为几乎任何系统上都可用的一种类型的 shell 编写特定的代码(不包括微 Controller 和 SoC 或大型铁杆和 sparc 站, bash 适用于大多数系统,但是确实有些系统不执行 bash,因此 bash 不是 100% 可移植性的最佳选择,但它绝对是最(滥用)使用的 ;-)

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

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

长话短说:
统一的跨平台脚​​本是一个白日梦,因为跨系统二进制文件的差异阻止了这一点。

关于macos - 为什么/bin/sh 在 Mac 和 Ubuntu 上表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19943767/

相关文章:

linux - 如何逐行计算没有单词的行 word2 -bash 在哪里

ruby - Jekyll - 找不到命令

bash - 如何设置 Airflow 的电子邮件配置以发送有关错误的电子邮件?

python - 为什么在命令行中使用 sys.argv 时没有引号?

linux - 如何在 Linux shell 脚本中将某些内容打印到控制台的最右侧

objective-c - 将控件/按钮栏添加到配置为源列表的 NSOutlineView 的底部

objective-c - NSView 在 NSSplitView 上设置最小尺寸

ios - plist 有哪些类型?

php - PHP 内置服务器错误日志位置是什么?

linux - 意外标记附近的语法错误 'then'