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
、、date
和printf
许多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
答案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"