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

The*_*One 33 linux command-line terminal.app linux-terminal macos

OS X 终端中默认可用的命令似乎不像他们的 linux 版本。如何用实际的 GNU linux 命令替换所有这些命令?

例如 sed -i 需要一个烦人的附加 "" 参数。此外,它仅适用于文本文件。这是没用的。

all*_*tic 43

在一般情况下,您根本不能(或不应该)替换默认命令。原因是许多系统管理脚本和第三方软件包可能依赖于这些命令来运行它们在 OS X 上开箱即用的方式。

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

可以做的是安装一个环境,在另一个目录中安装 GNU 实用程序而不覆盖默认值,然后调整您的PATH环境变量,以便它在搜索系统目录之前优先考虑在 GNU 目录中找到的命令。您可以将其连接起来,以便它仅在您启动交互式 shell 时以这种方式设置您的 PATH;bash如果你想这样做,你可以谷歌如何做到这一点或在 SU 上提出另一个问题(或搜索它,因为之前可能有人问过它)。

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

brew install coreutils
Run Code Online (Sandbox Code Playgroud)

并安装GNU Coreutils。这些将为您提供seddateprintfwc和许多其他工具与GNU / Linux的,而不是OS X.然而船,以免“覆盖”默认OS X的二进制文件,他们将被作为前缀g默认。因此,在安装 Coreutils 之后,如果您想使用 GNU sed,请键入

gsed
Run Code Online (Sandbox Code Playgroud)

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

PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"
Run Code Online (Sandbox Code Playgroud)

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

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

  • 无论出于何种原因,`brew install coreutils` 不包括 `sed`。你可以做`brew install gnu-sed`,但是这会安装`gsed`而不是`sed`,即使你更新了你的`$PATH`。我创建了一个符号链接来隐藏 Mac 的 `sed`:`ln -s $(which gsed) $(brew --prefix coreutils)/libexec/gnubin/sed` 但是你仍然需要执行 `man gsed` 才能看到正确的联机帮助页. (13认同)
  • `brew install gnu-sed --default-names` 将其安装为 `sed` (6认同)