MacOS 命令行-可以在 MacOS 和 Linux 之间编写可移植脚本吗?

MacOS 命令行-可以在 MacOS 和 Linux 之间编写可移植脚本吗?

我对 MacOS 作为开发平台感到非常满意,它有点类似于 Linux 命令行,但也有一些值得注意的例外:

  • 所有命令:参数解析行为不同。Linux 将接受任何顺序的标志,包括文件后面的标志。在 MacOS 中,文件后面的标志将被忽略;标志必须在任何文件名之前显示

  • base64:默认情况下未安装。一旦安装,将不接受 Linux 上忽略 base64 编码文本中空格所需的“-i”标志。

  • sed:MacOS 处理“-i”标志的方式与 Linux 截然不同(需要一个扩展,该扩展会破坏 Linux 上的脚本)。扩展正则表达式在 MacOS 上为“-E”,在 Linux 上为“-e”

(以及各种其他问题...)

在几乎所有情况下,我都发现 Linux 行为变体更易于使用/功能更强大。有没有办法升级 MacOS 命令行实用程序以使其更类似于 Linux?或者我的想法是错误的,应该喝点 kool-aide?虽然这很小,但当我尝试在 Linux / MacOS 开发箱之间来回移动时,这些故障让我抓狂。

答案1

Darwin 是 Mac OS X 的 Unix 基础,本质上是 BSD 的一种,所以您看到的一些差异就是由此而来的。大多数或所有 Linux 发行版中缺少某些标准工具,可以通过以下方法解决

  • 使用包管理器,例如
    • MacPorts,或
    • Fink;或
  • 从源代码安装。

有时软件包落后得令人无法接受。例如,我发现 tmux 1.4 中有一个错误,导致我无法使用它,但 macports 还没有 1.5。因此,在许多情况下,从源代码安装可能更可取。

答案2

各种 GNU 工具可以在 Fink 或 DarwinPorts 或诸如此类的地方找到。

答案3

有一堆“相同”的程序在一个 *nix 中解释选项的方式与在另一个 *nix OS(包括 Linux)中解释相同选项的方式不同。对此我们无能为力。

如果 shell 的内置命令让您感到困扰,请在 shell 中输入 ps -p $$。查看 CMD 下 shell 输出的名称。如果 shell 不同,则只需在 OSX 上安装与 linux 中相同类型的 shell。可以是 tcsh 和 zsh。

答案4

  1. 安装自制

  2. “brew 安装 coreutils gnu-sed gnu-tar gnu-getopt gnu-time gnu-which”

然后,所有标准 Linux 内容都可以使用“g”前缀 - 因此使用“gtar”而不是“tar”。

只需一点技巧,就可以在原始 BSD 程序和 GNU/Linux 版本之间切换。例如,设置一个具有符号链接(如 tar --> /usr/local/bin/gtar)的 /usr/local/gnubin。然后首先将该目录放入 PATH 变量中。也可以使用别名,但我不太喜欢与真实程序相同的别名(我发现这很脆弱且容易出错)。

相关内容