Jef*_*rey 2 macos bash shell ubuntu sh
我正在写一个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)
我的问题是:
我的问题是:
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,它可能因系统而异. .use#!/ 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:
统一的跨平台脚本是一个梦想,因为跨系统的二进制文件的差异阻止了这一点.
这不是shell的行为方式不同,而是您正在运行的命令.在Ubuntu上,这些来自GNU世界,在MacOS上,它们可能是一些BSD变体.这通常意味着,在MacOS上你的功能更少.:)
应该注意的是,这(我猜)也适用/bin/sh,但这不是你看到破损的原因.