如何用GNU核心实用程序替换Mac OS X实用程序?


179

我发现在Mac OSX和Linux上使用的实用程序命令之间存在一些差异。我想使我的经验统一起来。

如何用GNU实用程序替换所有mac实用程序?




16
我很同情您的挫败感,但我相信,从长远来看,如果将它们替换掉,它将带来更大的挫败感-尝试homebrew按照以下建议执行相同的操作后,我建议使用a ggsedgreadlink等等),而不是替换系统实用程序。
cwd 2015年


3
我不同意@cwd,使用--with-default-names只会影响本地用户。这可能是面向Mac的终端实用程序的问题,但是如果您对所有内容都使用homebrew,则可能还假装正在使用linux。与iterm2混合使用,对我来说效果很好,我基本上可以假装自己已经装满了Linux机器。
雷·福斯

Answers:


209

这会将带有g前缀的GNU实用程序的符号链接添加到/usr/local/bin/

brew install coreutils findutils gnu-tar gnu-sed gawk gnutls gnu-indent gnu-getopt grep

另请参阅brew search gnu。如果要使用不带ag前缀的命令,请/usr/local/opt/coreutils/libexec/gnubin在上的其他目录之前添加例如PATH

$ brew info coreutils
coreutils: stable 8.21
http://www.gnu.org/software/coreutils
Depends on: xz
/usr/local/Cellar/coreutils/8.20 (208 files, 9.4M)
/usr/local/Cellar/coreutils/8.21 (210 files, 9.6M) *
https://github.com/mxcl/homebrew/commits/master/Library/Formula/coreutils.rb
==> Caveats
All commands have been installed with the prefix 'g'.

If you really need to use these commands with their normal names, you
can add a "gnubin" directory to your PATH from your bashrc like:

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

Additionally, you can access their man pages with normal names if you add
the "gnuman" directory to your MANPATH from your bashrc as well:

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

6
FWIW,我有一个自制的公式中,作为一个元包所有这些伟大的GNU utils的:看到shiny-and-gnu.rbgithub.com/al-the-x/homebrew-mine
AL的X

1
第一个PATH有效,但是MANPATH失败了,为什么?是因为我正在使用OSX10.10吗?我回显了$ MANPATH,然后得到/usr/local/opt/coreutils/libexec/gnuman:,似乎未包含原始的MANPATH。在我的bashrc中注释掉MANPATH conf之后,我什么也没得到ecoh $MANPATH。当然,如果使用man pwd,我会得到BSD手册。如何解决这个问题?

2
对于findutils,您需要添加PATH="/usr/local/Cellar/findutils/4.4.2/bin:$PATH"安装控制台输出中未说明的内容。
Sridhar Sarnobat

1
另外,要获取正确的手册页findutils,请将其添加到您的$MANPATH /usr/local/opt/findutils/share/man
Christian Long

1
@Zen:初始化MANPATH以保持默认系统值的正确方法是:MANPATH="/usr/local/opt/coreutils/libexec/gnuman:${MANPATH-/usr/share/man}"。关键在于构造${var-default_value}
2015年

49

此外brew install coreutils,您可能还需要安装其他软件包,例如gnu-sedgrep

brew install findutils
brew install gnu-indent
brew install gnu-sed
brew install gnutls
brew install grep
brew install gnu-tar
brew install gawk

请注意,自2019年1月以来该--with-default-names选项已删除,因此如果要使用不带g前缀的二进制文件,则必须将其添加到路径中。

旧参考资料(如果--with-default-names有):http : //www.topbug.ne​​t/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/


请注意brew install gawk(与其他所有awk符号不同)将替换(通过符号链接/usr/local/bin/awk)。如果您想保留原始照片/usr/bin/awk,请rm /usr/local/bin/awk
Wisbucky

16

我不确定是否建议更换它们;但是,您可以将它们安装到其他路径并以这种方式使用它们。总体而言,如果您来自Linux,并且希望访问更多的“通用” * nix实用程序以及类似于apt的系统,那么我建议您研究一下Macports:http : //www.macports.org

例如,它允许使用最新的“通用” GCC,而不是/包括Apple随附的GCC。


3
例如,Mac OS X中的tar和zip知道GNU版本不知道的元数据。
lhf 2012年

1
有Apple提供的应用程序,这些应用程序只是某些命令行工具的GUI,如果替换它们,这些应用程序可能会开始表现异常,因此,请添加而不是替换。
ⱮarkƬ

对; 诸如Macports之类的东西会添加它们,而不是替换它们。
乔纳森(Jonathan)

如果要在MacPorts中默认使用GNU实用程序,则可以将其添加/opt/local/libexec/gnubinPATH环境变量的前面。
markhep

8

我已经写了一个脚本来做到这一点!可以在这里(或下面)查看脚本。但是,我不能总是保证这篇文章会反映以前链接的脚本的最新版本。

运行脚本后,将安装Homebrew(如果尚未安装),将安装所有关联的GNU实用程序(如果尚未安装),并且PATH将从已安装的实用程序中构建变量。

#!/bin/bash

# Install Homebrew (if not already installed)
ruby -e "$(curl -fsSL "\
"https://raw.githubusercontent.com/Homebrew/install/master/install)"

# Install required packages from Homebrew
brew tap homebrew/dupes
brew install coreutils binutils diffutils ed findutils gawk gnu-indent gnu-sed \
  gnu-tar gnu-which gnutls grep gzip screen watch wdiff wget bash gdb gpatch \
  m4 make nano file-formula git less openssh python rsync svn unzip vim \
  --default-names --with-default-names --with-gettext --override-system-vi \
  --override-system-vim --custom-system-icons

# Empty the .bash_path file that holds GNU paths
> ~/.bash_path

# Build PATH variable script in ~/.bash_path
for i in /usr/local/Cellar/*/*/bin; do
  echo 'export PATH="'$i':$PATH"' >> ~/.bash_path
done
for i in /usr/local/Cellar/*/*/libexec/gnubin; do
  echo 'export PATH="'$i':$PATH"' >> ~/.bash_path
done
for i in /usr/local/Cellar/*/*/share/man; do
  echo 'export MANPATH="'$i':$MANPATH"' >> ~/.bash_path
done
for i in /usr/local/Cellar/*/*/libexec/gnuman; do
  echo 'export MANPATH="'$i':$MANPATH"' >> ~/.bash_path
done

# Check if .bash_path is being called from .bash_profile
PATCH=`grep "~/.bash_path" ~/.bash_profile`
if [ "$PATCH" == "" ]; then
  # Add Ubuntu-style PS1 to .bash_profile
  cat <<EOF > ~/.bash_profile
export PS1="\[\033[1;32m\]\u@\h\[\033[0m\]:\[\033[1;34m\]\w\[\033[0m\]# "
EOF
  # Add .bash_path to .bash_profile
  echo "source ~/.bash_path" >> ~/.bash_profile
fi

1
您是否只是不喜欢批评意见而没有批评意见?谢谢你的脚本。
贾斯汀原力

@JustinForce没问题!感谢您的反馈。
Clay Freeman

2
-1。这个脚本做了太多的魔术。.bash_path如果遵循@ user495470和@xuhdev的回答,则所有-mangling并不是真正必要的。更改PS1完全不在此问题的范围内。
格雷格·杜比奇

1
@GregDubicki不幸的是,其中某些软件包需要bash路径“ mangling”。您可以自己检查。关于更改PS1:此脚本供个人使用。任何希望还原它的人都可以很容易地做到这一点。
克莱·弗里曼

5

我编写了一个脚本,该脚本通过以下方式透明地将macOS CLI转换为全新的GNU / Linux CLI体验

  • 安装丢失的GNU程序
  • 更新过时的GNU程序
  • 用首选的GNU实施代替预装的BSD程序
  • 安装流行的GNU / Linux发行版中常见的其他程序

https://github.com/fabiomaia/linuxify

git clone https://github.com/fabiomaia/linuxify.git
cd linuxify/
./linuxify install

它还使您可以轻松撤消所有操作。

./linuxify uninstall

1
尝试运行第一个命令(git clone git@github.com.:fabiomaia/linuxify.git)首先说“无法建立主机'github.com'的真实性,等等。”。我输入yes并按Enter。然后说git@github.com: Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists.什么错了?
izogfif

@izogfif尝试使用HTTPS克隆git clone https://github.com/fabiomaia/linuxify.git
fabiomaia

1
是的,那行得通。请更新您的答案(也请一开始删除这些美元-选择文本并将其复制粘贴到控制台时,它们将被复制)。
izogfif

@izogfif谢谢您的建议。
fabiomaia
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.