默认情况下,OS X的“终端”中可用的命令的行为似乎不像其Linux版本。如何用实际的GNU linux命令替换所有命令?
例如sed -i需要一个讨厌的附加“”参数。此外,它仅适用于文本文件。这没用。
默认情况下,OS X的“终端”中可用的命令的行为似乎不像其Linux版本。如何用实际的GNU linux命令替换所有命令?
例如sed -i需要一个讨厌的附加“”参数。此外,它仅适用于文本文件。这没用。
Answers:
在一般情况下,您根本不能(或不应)替换默认命令。原因是许多系统管理脚本和第三方程序包可能依赖这些命令来表现它们在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。这些将为您提供sed
,date
,printf
,wc
和许多其他工具与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可能是不切实际或不可能的。
brew install coreutils
都不包括sed
。您可以执行brew install gnu-sed
此操作,即使您更新了,也gsed
不会安装。我创建了一个符号链接来隐藏Mac的符号链接:但是,仍然需要查看正确的联机帮助页。sed
$PATH
sed
ln -s $(which gsed) $(brew --prefix coreutils)/libexec/gnubin/sed
man gsed
brew install gnu-sed --default-names
将其安装为sed
--default-names
可以使用g前缀命令代替安装,然后安装oh-my-zsh(强烈建议)并启用插件gnu-utils。