用 Linux 版本替换 OS X 的 shell 命令?

用 Linux 版本替换 OS X 的 shell 命令?

OS X 终端中默认可用的命令似乎与 Linux 版本的行为不同。我如何用实际的 GNU Linux 命令替换它们?

例如 sed -i 需要一个烦人的额外“”参数。此外,它只适用于文本文件。这毫无用处。

答案1

在一般情况下,你不能(或不应该) 完全取代默认命令。原因是许多系统管理脚本和第三方软件包可能依赖这些命令在 OS X 上以开箱即用的方式运行。

因此,如果您只是删除系统命令并将其替换为具有不兼容行为或命令行参数的 GNU 等效命令,则可能会破坏某些功能。 特别是如果您使用一些最初设计为在 Linux 或 BSD 上运行后“移植”到 Mac OS X 的软件,因为这些类型的程序更有可能依赖 shell 脚本和系统命令,而不是调用 OS X API。

要做的是安装一个环境,在另一个目录中安装 GNU 实用程序,而不覆盖默认设置,然后调整PATH环境变量这样它就会在搜索系统目录之前优先处理在 GNU 目录中找到的命令。您可以将其连接起来,以便只有在您启动交互式 shell 时才以这种方式设置您的 PATH;bash如果您想这样做,您可以在 Google 上搜索如何执行此操作或在 SU 上询问另一个问题(或搜索它,因为它可能以前被问过)。

这种环境的一个例子是自制例如,它有 GNUsed等。安装 Homebrew 后,你可以输入

brew install coreutils

并安装GNU 核心实用程序。这些将为您提供sed、、dateprintf许多wc其他随 GNU/Linux 附带的工具,但不提供 OS X。但是,为了不“覆盖”默认的 OS X 二进制文件,g默认情况下它们将以 为前缀。因此,安装 Coreutils 后,如果您想使用 GNU sed,请键入

gsed

如果每次输入都太麻烦,您可以将“gnubin”目录添加到您的 PATH 中,然后只需使用 调用 GNU sed 即可sed。您需要将以下内容添加到您的~/.bash_profile

PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"

当然,如果你需要一个完整的 Linux 环境(内核、X11、系统调用兼容性等),你就必须在虚拟机中运行 Linux,例如虚拟盒。如果您需要运行专门设计在 Linux 上运行的软件或脚本,这是一个安全的选择。

Homebrew 仅能为您提供某些不需要 Linux 特定行为的程序的兼容性。例如,inotify仅在 Linux 上可用。drm(直接渲染管理器)仅在 Linux 上可用。还有一些其他相当低级的系统调用仅在 Linux 上可用,而 OS X 上没有相应的系统调用,因此如果不进行重大代码更改,将某些程序从 Linux 移植到 OS X 是不切实际或不可能的。

答案2

你可以使用Gentoo 前缀支持 OS X,你可以通过以下方式执行此操作引导它然后将前缀目录中的相关路径添加到您的 PATH。这可能已经为您完成了。完成此操作后,您可以使用标准 Gentoo 命令来安装软件包。

emerge coreutils例如,将为你提供标准的 GNU 实用程序。

请注意,Gentoo 默认编译,你可能需要设置二进制主机而是。这只是使用该文章后半部分的一个 URL,并将其放在前缀中PORTAGE_BINHOST="... your url here ..."./etc/make.conf

答案3

作为@allquixotic帖子的后续,以下是官方说明brew install coreutils

所有命令均已安装前缀“g”。

如果你确实需要使用这些命令及其正常名称,可以从你的 bashrc 中将“gnubin”目录添加到你的 PATH 中,例如

PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"

此外,你也可以从 bashrc 中使用正常名称“gnuman”目录访问它们的手册页,并将其添加到你的 MANPATH 中

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"

答案4

sed您可以从Rudix项目。有关更多Rudix软件包,请参阅这里这里

相关内容