我正在编写一个 sh 文件来获取文件的修改时间。我希望 sh 文件适用于 Mac 和 Ubuntu。
我使用/bin/sh 并将 #!/bin/sh 添加到 bash 文件的第一行。我想/bin/sh 在两个操作系统上的行为应该相同。但事实并非如此。以下是差异的两个示例。
下面的脚本适用于 Mac 但不适用于 Ubuntu。
modTime=$(stat -f "%m"-t "%s"$filepath)
下面的脚本适用于 Ubuntu,但不适用于 Mac。
modTime=$(date +%s -r $filepath)
我的问题是:
- 为什么/bin/sh 在 Mac 和 Ubuntu 上的行为不同?
- 如果要写跨平台的sh脚本,应该如何避免平台依赖的代码?
最佳答案
- 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 等等。
- If I want to write the cross-platforma sh script, how should I avoid the platform-dependent code?
正式:严格遵守 POSIX 规则以在任何 POSIX 兼容的 shell 上运行
务实地:为几乎任何系统上都可用的一种类型的 shell 编写特定的代码(不包括微 Controller 和 SoC 或大型铁杆和 sparc 站, bash 适用于大多数系统,但是确实有些系统不执行 bash,因此 bash 不是 100% 可移植性的最佳选择,但它绝对是最(滥用)使用的 ;-)
最佳便携性:作为 Ubuntu 用户的经验法则:如果它在 dash(ubuntu 的/bin/sh)上运行,它几乎可以在任何东西上运行(包括您的路由器、 toastr 和咖啡机)。
最重要的是:user2719058 是对的,OSX 不是 Linux 而是 BSD-UNIX,因此虽然它们可以运行相同的 shell,但命令的不同足以使其非常非常困难写一个适合所有人的脚本。选择最好的 shell 不会改变这一点....因此,除非每个系统上的系统命令也符合 POSIX,否则统一脚本语言的值(value)在此被证明是非常有限的。
长话短说:
统一的跨平台脚本是一个白日梦,因为跨系统二进制文件的差异阻止了这一点。
关于macos - 为什么/bin/sh 在 Mac 和 Ubuntu 上表现不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19943767/