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


32

默认情况下,OS X的“终端”中可用的命令的行为似乎不像其Linux版本。如何用实际的GNU linux命令替换所有命令?

例如sed -i需要一个讨厌的附加“”参数。此外,它仅适用于文本文件。这没用。


1
嗯... sed是一个“文本编辑器”,它也可以修改二进制文件。您还要它做什么?请解释您到底需要什么。我无法理解您的问题,您能再举一些例子吗?
terdon 2012年

3
sed实际上是一个流编辑器。不必学究,但实际上并不是要修改文件,除非这些文件是流。这就是为什么该-i标志是非标准的原因。ed用于编辑文件。
kojiro 2012年

Answers:


43

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

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

可以做的是安装一个环境,该环境将GNU实用程序安装在另一个目录中而不覆盖默认值,然后调整您的PATH环境变量,以便在搜索系统目录之前,它优先于GNU目录中找到的命令。您可以进行连接,以便仅在启动交互式shell时才以这种方式设置PATH。您可以通过Google搜索该操作的方法bash或在SU上询问其他问题(或搜索它,因为之前可能已经被询问过)是否要这样做。

这样的环境的一个例子是Homebrew,例如在sed其中还具有GNU 。安装Homebrew后,您可以输入

brew install coreutils

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

gsed

如果每次都要输入太多麻烦信息,则可以在PATH中添加一个“ gnubin”目录,并只需通过调用GNU sed sed。您需要将以下内容添加到您的~/.bash_profile

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

当然,如果您需要从繁琐的Linux环境(内核,X11,系统调用兼容性等),则必须在虚拟机(例如VirtualBox)中运行Linux 。如果您需要运行旨在在Linux上运行的软件或脚本,那么这是一个安全的选择。

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


总是有新兵训练营。:)
kojiro 2012年

13
出于任何原因brew install coreutils都不包括sed。您可以执行brew install gnu-sed此操作,即使您更新了,也gsed不会安装。我创建了一个符号链接来隐藏Mac的符号链接:但是,仍然需要查看正确的联机帮助页。sed$PATHsedln -s $(which gsed) $(brew --prefix coreutils)/libexec/gnubin/sedman gsed
dimo414

6
brew install gnu-sed --default-names将其安装为sed
ivotron 2013年

1
--default-names可以使用g前缀命令代替安装,然后安装oh-my-zsh(强烈建议)并启用插件gnu-utils。
bibstha 2014年

3

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

emerge coreutils 例如,将为您提供标准的GNU utils。

请注意,Gentoo默认是编译的,您可能想设置一个二进制主机。这仅仅是使用在该文章的后半部分中有一个网址,并把它放在PORTAGE_BINHOST="... your url here ..."./etc/make.conf您的前缀。


1

作为@allquixotic帖子的后续内容,以下是每篇文章的官方说明 brew install coreutils

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

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

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

另外,您也可以从bashrc到其MANPATH中以常规名称“ gnuman”目录访问其手册页

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.