¿Cómo reemplazar las utilidades de Mac OS X con las utilidades principales de GNU?


181

Descubrí que hay algunas diferencias entre el comando de utilidad que utilicé en Mac OSX y Linux. Quiero unir mi experiencia.

¿Cómo podría reemplazar todas mis utilidades de Mac con las utilidades de GNU?



2
Aquí hay una guía topbug.net/blog/2013/04/14/…
Dennis

16
Simpatizo con sus frustraciones, pero creo que, a largo plazo, causará una mayor frustración si se reemplazan . Después de intentar hacer lo mismo, recomendaría usar homebrewcomo se menciona a continuación, y luego aprender a usar las utilidades con un g( gsed, greadlink, etc) en lugar de la sustitución de las utilidades del sistema.
cwd


3
No estoy de acuerdo con @cwd, el uso --with-default-namessolo afecta al usuario local. Podría ser un problema con las utilidades de terminal orientadas a Mac, pero si usa homebrew para todo, también podría pretender que está usando Linux. Mezclado con iterm2, funciona muy bien para mí, básicamente puedo fingir que estoy en casa con mis cajas de Linux.
Ray Foss

Respuestas:


210

Esto agrega enlaces simbólicos para utilidades GNU con el prefijo g para /usr/local/bin/:

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

Ver brew search gnupara otros paquetes. Si desea utilizar los comandos sin el prefijo ag, agregue, por ejemplo, /usr/local/opt/coreutils/libexec/gnubinantes de otros directorios en su 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"

66
FWIW, tengo una fórmula Homebrew que actúa como un meta-paquete para todas esas excelentes utilidades de GNU: ver shiny-and-gnu.rben github.com/al-the-x/homebrew-mine
AL the X

1
El primer PATH funciona, pero MANPATH falló, ¿por qué? ¿Es porque estoy usando OSX10.10? Me hice eco de $ MANPATH, y obtuve /usr/local/opt/coreutils/libexec/gnuman:, parece que MANPATH original no estaba incluido. Después de comentar el conf de MANPATH en mi bashrc, no conseguí nada ecoh $MANPATH. Y, por supuesto, si lo uso man pwd, obtuve el manual BSD. ¿Cómo arreglar esto?
Zen

2
Para findutils, debe agregar lo PATH="/usr/local/Cellar/findutils/4.4.2/bin:$PATH"que no se indica en la salida de la consola de instalación.
Sridhar Sarnobat

1
Además, para obtener la página de manual adecuada para findutils, agregue esto a su$MANPATH /usr/local/opt/findutils/share/man
Christian Long

1
@Zen: la manera correcta para iniciar MANPATHel fin de mantener el valor por defecto del sistema es: MANPATH="/usr/local/opt/coreutils/libexec/gnuman:${MANPATH-/usr/share/man}". La clave está en la construcción ${var-default_value}.
dan

50

Además brew install coreutils, es posible que tenga que instalar otros paquetes, como por ejemplo gnu-sed, grep:

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

Tenga en cuenta que la --with-default-namesopción se elimina desde enero de 2019, por lo que cada binario debe agregarse a la ruta si se van a usar sin el gprefijo.

Referencia anterior (cuando --with-default-namesestaba disponible): http://www.topbug.net/blog/2013/04/14/install-and-use-gnu-command-line-tools-in-mac-os-x/


Tenga en cuenta que brew install gawk(a diferencia de todos los demás) reemplazará awk(a través de un enlace simbólico /usr/local/bin/awk). Si desea conservar el original /usr/bin/awk, solorm /usr/local/bin/awk
wisbucky

17

No estoy seguro de que recomendaría reemplazarlos ; sin embargo, puede instalarlos en una ruta diferente y utilizarlos de esa manera. En general, si viene de Linux y desea acceder a más utilidades "genéricas" * nix, y un sistema similar a apt, entonces recomendaría buscar en Macports: http://www.macports.org

Permite, por ejemplo, usar el último GCC "genérico", a diferencia de / además del GCC incluido de Apple, solo como ejemplo.


3
Por ejemplo, tar y zip de Mac OS X saben sobre metadatos que las versiones de GNU no.
lhf

1
Hay aplicaciones proporcionadas por Apple, que son solo GUI para algunas herramientas de línea de comandos y si las reemplaza, las aplicaciones pueden comenzar a comportarse de manera extraña, así que agregue, no reemplace.
Ɱark Ƭ

Derecho; algo como Macports los agrega, no los reemplaza.
Jonathan

Si desea utilizar las utilidades GNU de manera predeterminada con MacPorts, puede agregarlas /opt/local/libexec/gnubinal frente de su PATHvariable de entorno.
markshep

8

¡He escrito un guión para hacer exactamente esto! El guión se puede ver aquí (o debajo). Sin embargo, no siempre puedo garantizar que esta publicación reflejará la última versión del script vinculado anteriormente.

Al ejecutar el script, se instalará Homebrew (si no es así), se instalarán todas las utilidades GNU asociadas (si no es así) y la PATHvariable se construirá a partir de las utilidades instaladas.

#!/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
¿No te encantan los votos negativos sin comentarios críticos? Gracias por el guion.
Justin Force

@JustinForce ¡No hay problema! Gracias por los comentarios.
Clay Freeman

2
-1. Este guión hace demasiada magia. Todo el .bash_pathcambio no es realmente necesario si sigue las respuestas de @ user495470 y @ xuhdev. Y cambiar PS1 está completamente fuera del alcance de esta pregunta.
Greg Dubicki

1
@GregDubicki desafortunadamente, la ruta de bash "destrozada" es necesaria para algunos de estos paquetes. Puedes comprobar esto por ti mismo. Con respecto al cambio de PS1: este script es para uso personal. Cualquiera que desee revertirlo puede hacerlo muy fácilmente.
Clay Freeman

5

He escrito un script que transforma de manera transparente la CLI de macOS en una nueva experiencia de CLI de GNU / Linux por

  • instalar programas faltantes de GNU
  • Actualización de programas obsoletos de GNU
  • reemplazando programas BSD preinstalados con su implementación GNU preferida
  • Instalar otros programas comunes entre las distribuciones populares de GNU / Linux

https://github.com/fabiomaia/linuxify

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

También te permite deshacer todo fácilmente.

./linuxify uninstall

1
Intentando ejecutar el primer comando ( git clone git@github.com.:fabiomaia/linuxify.git) Primero dijo "No se puede establecer la autenticidad del host 'github.com', etc.". Escribí yesy presioné Enter. Entonces dijo 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.¿Qué pasa?
izogfif

@izogfif Intente clonar con HTTPS en su lugargit clone https://github.com/fabiomaia/linuxify.git
fabiomaia

1
Sí, eso funcionó. Actualice su respuesta (también, elimine esos dólares al principio; se copian al seleccionar texto y copiar y pegar en la consola).
izogfif

@izogfif Gracias por las sugerencias.
fabiomaia
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.