Sign up ×
Ask Different is a question and answer site for power users of Apple hardware and software. It's 100% free, no registration required.

I found there is some differences between the utility command I used on the mac OSX and linux. I want to make my experience united.

How could I replace all my mac utilities with GNU utilities?

share|improve this question
See also…. – lhf Nov 9 '12 at 23:44
Here's a guide… – Dennis Mar 19 at 8:50
I sympathize with your frustrations but I believe that, in the long term, it will cause greater frustration if they are replaced - After seeking to do the same thing I'd recommend using homebrew as mentioned below, and then just learning to use the utilities with a g ( gsed, greadlink, etc ) instead of replacing the system utilities. – cwd Mar 29 at 13:51

4 Answers 4

up vote 75 down vote accepted

This adds symlinks for GNU utilities with g prefix to /usr/local/bin/:

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

See brew search gnu for other packages. If you want to use the commands without a g prefix, install the formulas with --default-names, or add for example /usr/local/opt/coreutils/libexec/gnubin before other directories on your PATH.

$ brew info coreutils
coreutils: stable 8.21
Depends on: xz
/usr/local/Cellar/coreutils/8.20 (208 files, 9.4M)
/usr/local/Cellar/coreutils/8.21 (210 files, 9.6M) *
==> 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:


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


You can install GNU grep by tapping homebrew/dupes:

brew tap homebrew/dupes; brew install grep
share|improve this answer
FWIW, I have a Homebrew Formula that acts as a meta-package for all those great GNU utils: see shiny-and-gnu.rb in – AL the X May 13 '14 at 20:47
The first PATH works, but MANPATH failed, why? Is it because I'm using OSX10.10? I echoed $MANPATH, and I got /usr/local/opt/coreutils/libexec/gnuman:, seems original MANPATH wasn't include. After commented out the MANPATH conf in my bashrc, I got nothing by ecoh $MANPATH. And of course, if I use man pwd, I got the BSD manual. How to fix this? – Zen Mar 5 at 15:42
For findutils, you need to add PATH="/usr/local/Cellar/findutils/4.4.2/bin:$PATH" which is not stated in the installation console output. – Sridhar-Sarnobat Apr 28 at 20:09
In addition, to get the right man page for findutils, add this to your $MANPATH /usr/local/opt/findutils/share/man – Christian Long Aug 3 at 19:05
@Zen: the right way to initiate MANPATH so as to keep the default system value is: MANPATH="/usr/local/opt/coreutils/libexec/gnuman:${MANPATH-/usr/share/man}". The key is in the construct ${var-default_value}. – daniel Azuelos Oct 6 at 7:43

Besides brew install coreutils, you may also need to install some other packages, such as gnu-sed, grep (some of the packages require you to run brew tap homebrew/dupes first):

brew install findutils --with-default-names
brew install gnu-indent --with-default-names
brew install gnu-sed --with-default-names
brew install gnutls
brew install grep --with-default-names
brew install gnu-tar --with-default-names
brew install gawk

The --default-names option is optional, turn on this if you really need to use these GNU commands as default ones, or they will be compiled with a g prefix.


share|improve this answer
Could you please summarise the info here and not just provide a link - answers should be standalone with links only for extra information – Mark Apr 15 '13 at 8:36
Welcome to the site. Answers on Ask Different need to be more than just a link. It's okay to include a link, but please summarize or excerpt it in the answer. The idea is to make the answer stand alone. – patrix Apr 15 '13 at 8:43
Thanks for your comments! I'll edit it. – xuhdev Apr 15 '13 at 15:42
brew untap homebrew/dupes; brew tap homebrew/dupes; brew install grep worked for me. – Stefan Schmidt Dec 23 '13 at 3:53
@StefanSchmidt I guess something went wrong with your homebrew. homebrew tap --repair should work as well. – xuhdev Dec 23 '13 at 8:15

I'm not sure that I would recommend replacing them; however, you can install them to a different path and utilize them that way. Overall, if you are coming from Linux and would like access to more "generic" *nix utilities, and a system similar to apt, then I would recommend looking into Macports:

It allows, for example, using the latest "generic" GCC, as opposed to/in addition to Apple's included GCC, just as an example.

share|improve this answer
For instance, tar and zip from Mac OS X know about metadata that the GNU versions do not. – lhf Oct 22 '12 at 17:49
There are Apple supplied apps, which are just GUIs for some command line tools and if you replace them the apps may start behaving strangely, so go with adding, not replacing. – Mark Oct 23 '12 at 11:56
Right; something like Macports adds them, it doesn't replace them. – Jonathan Oct 23 '12 at 12:10

I've written a script to do exactly this! The script can be viewed here (or below). However, I can't always guarantee this post will reflect the latest version of the script linked previously.

Upon running the script, Homebrew will be installed (if not already), all the associated GNU utilities will be installed (if not already), and the PATH variable will be built from the installed utilities.


# Install Homebrew (if not already installed)
ruby -e "$(curl -fsSL "\

# 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
for i in /usr/local/Cellar/*/*/libexec/gnubin; do
  echo 'export PATH="'$i':$PATH"' >> ~/.bash_path
for i in /usr/local/Cellar/*/*/share/man; do
  echo 'export MANPATH="'$i':$MANPATH"' >> ~/.bash_path
for i in /usr/local/Cellar/*/*/libexec/gnuman; do
  echo 'export MANPATH="'$i':$MANPATH"' >> ~/.bash_path

# 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\]# "
  # Add .bash_path to .bash_profile
  echo "source ~/.bash_path" >> ~/.bash_profile
share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.