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?
Ask Different is a question and answer site for power users of Apple hardware and software. It only takes a minute to sign up.Sign up to join this community
This adds symlinks for GNU utilities with g prefix to
brew install coreutils findutils gnu-tar gnu-sed gawk gnutls gnu-indent gnu-getopt grep
brew search gnu for other packages. If you want to use the commands without a g prefix add for example
/usr/local/opt/coreutils/libexec/gnubin before other directories on your
$ 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"
brew install coreutils, you may also need to install some other packages, such as
brew install findutils brew install gnu-indent brew install gnu-sed brew install gnutls brew install grep brew install gnu-tar brew install gawk
Note that the
--with-default-names option is removed since January 2019, so each binary has to be added to the path if they are to be used without the
Old reference (when
--with-default-names was available): http://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/
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: http://www.macports.org
It allows, for example, using the latest "generic" GCC, as opposed to/in addition to Apple's included GCC, just as an example.
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.
#!/bin/bash # Install Homebrew (if not already installed) /bin/bash -c "$(curl -fsSL "\ "https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # 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 [[ -f ~/.bash_path ]] && mv ~/.bash_path ~/.bash_path.orig # 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
I have written a script that transparently transforms the macOS CLI into a fresh GNU/Linux CLI experience by
git clone https://github.com/fabiomaia/linuxify.git cd linuxify/ ./linuxify install
It also allows you to easily undo everything.
As an alternative to setting the PATH and MANPATH environment variables (which I would actually recommend), it is also possible to symlink binaries to an existing PATH location like this:
You need to know where Homebrew installs
/usr/local/opt directory is where Homebrew stores relatively static files that are unlikely to change between updates.
Then you can create symbolic links from there to a location that is already on your PATH. It must be a path that is loaded early on PATH, because the PATH is searched on a first-come, first-serve basis.
/usr/local/bin is a good choice based on looking at
which sha256sum # prove it is not on PATH ln -s /usr/local/opt/coreutils/bin/sha256sum /usr/local/bin/ which sha256sum # prove it is on PATH
This way, it would almost as easy to create symbolic links. In some cases, like when you want tighter control, it is a good option rather than adding an entire directory to your PATH and MANPATH.
I agree with using
brew install coreutils to install the tools. But if you want to use them without the
g prefix and are using Oh My Zsh, you can add
gnu-utils to your zshrc file to do enable this easily:
More info available here: https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/gnu-utils