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

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

¿Cómo podría reemplazar todas mis utilidades mac con utilidades GNU?

Aquí hay una guía topbug.net/blog/2013/04/14/…
Comprendo sus frustraciones, pero creo que, a largo plazo, causará una mayor frustración si se reemplazan . Después de buscar hacer lo mismo, recomendaría usar homebrewcomo se menciona a continuación, y luego aprender a usar las utilidades con a g( gsed, greadlink, etc ) en lugar de reemplazar las utilidades del sistema.
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 fingir que está usando Linux. Combinado con iterm2, funciona muy bien para mí, básicamente puedo fingir que estoy en casa con mis cajas de Linux.
NOTA: cpy mvpuede ser peligroso para los atributos extendidos del archivo (p. ej., etiquetas, invisible, alias, paquete y más). Para más detalles, vea estos dos artículos: brettterpstra.com/2014/07/03/… brettterpstra.com/2014/07/04/how-to-lose-your-tags Están un poco anticuados, pero solo quiero plantear la advertencia para que pueda investigar si el uso de GNU interfiere con sus necesidades mv.cp
¿Alguien tiene un ejemplo concreto que demuestre que esto "provocará una mayor frustración"?
Ejemplo concreto de @cambunctious: un script que usa la utilidad predeterminada para su sistema se romperá.
@DeNovo eso no es concreto
@boileau, diría que es lo suficientemente concreto. Cualquier secuencia de comandos de instalación para un paquete que intente usar sus utilidades predeterminadas basadas en su sistema operativo puede fallar o hacer cosas extrañas y causar errores extraños. Eso sería bastante doloroso, creo. Cuándo sucederá, quién sabe, ¡pero es bastante probable!
@CodeNovitiate lo siento, pero decir "aquí hay una categoría vaga de cosas que podrían suceder" no es concreto. Concreto sería un enlace a un script que falla y una descripción de cómo.

Respuestas (6)

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

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

Consulte brew search gnupor otros paquetes. Si desea usar los comandos sin el prefijo ag, agregue, por ejemplo /usr/local/opt/coreutils/libexec/gnubin, antes de otros directorios en su archivo 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"
FWIW, tengo una fórmula Homebrew que actúa como un metapaquete para todas esas excelentes utilidades de GNU: consulte shiny-and-gnu.rben github.com/al-the-x/homebrew-mine
El primer PATH funciona, pero MANPATH falló, ¿por qué? ¿Es porque estoy usando OSX10.10? Hice eco de $MANPATH, y obtuve /usr/local/opt/coreutils/libexec/gnuman:, parece que MANPATH original no estaba incluido. Después de comentar la conf MANPATH en mi bashrc, no obtuve nada ecoh $MANPATH. Y por supuesto, si uso man pwd, obtuve el manual de BSD. ¿Cómo arreglar esto?
Para findutils, debe agregar PATH="/usr/local/Cellar/findutils/4.4.2/bin:$PATH"lo que no se indica en la salida de la consola de instalación.
Además, para obtener la página de manual adecuada para findutils, agregue esto a su$MANPATH /usr/local/opt/findutils/share/man
@Zen: la forma correcta de iniciar MANPATHpara mantener el valor predeterminado del sistema es: MANPATH="/usr/local/opt/coreutils/libexec/gnuman:${MANPATH-/usr/share/man}". La clave está en la construcción ${var-default_value}.
¿Hay algún paquete disponible que instale todas estas herramientas a la vez?
Estoy ejecutando esto para generar enlaces simbólicos en mi directorio ~/bin: utilDir=coreutils/8.25; cp -a /usr/local/Cellar/${utilDir}/libexec/gnubin/* ~/binsolo cambie el utilDirpara cada conjunto de utilidades que desee vincular. Entonces puedo configurar `PATH="/home/me/bin:$PATH" sin hacer tanto lío con diferentes directorios.
@danielAzuelos, parece que su fragmento tiene algunos caracteres Unicode extraños que aparecen al copiar y pegar: i.imgur.com/qQWygg2.png
@ Sridhar-Sarnobat ¿Para qué es eso?
no recuerdo Pero lo necesitaba para que el mío funcione. Supongo que no usaría la versión GNU findo algún otro programa común, que siempre se puede saber cuando se obtiene un error al usar findsin un argumento de directorio.
El entorno PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"ayudó. ¡Gracias!

Además brew install coreutils, es posible que también deba instalar algunos otros paquetes, gnu-sedcomo 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 eliminó 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) se reemplazará awk(a través de un enlace simbólico /usr/local/bin/awk). Si desea conservar el original /usr/bin/awk, simplementerm /usr/local/bin/awk
¿Hay una versión de GNU pingdisponible?
@HappyFace No lo creo. En GNU/Linux, pinges una utilidad del kernel de Linux: github.com/iputils/iputils

No estoy seguro de recomendar 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, le recomendaría buscar en Macports: http://www.macports.org

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

Por ejemplo, tar y zip de Mac OS X conocen metadatos que las versiones de GNU no conocen.
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.
Derecha; algo así como Macports los agrega, no los reemplaza.
Si desea utilizar las utilidades GNU de forma predeterminada con MacPorts, puede agregarlas /opt/local/libexec/gnubinal frente de su PATHvariable de entorno.

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

Al ejecutar el script, se instalará Homebrew (si aún no lo está), se instalarán todas las utilidades GNU asociadas (si aún no lo están) y la PATHvariable se creará a partir de las utilidades instaladas.

#!/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

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

  • instalar programas GNU faltantes
  • actualizar programas GNU obsoletos
  • reemplazar los 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 le permite deshacer todo fácilmente.

./linuxify uninstall
Intentando ejecutar el primer comando ( git clone git@github.com.:fabiomaia/linuxify.git) Primero decía "La autenticidad del host 'github.com' no se puede establecer, etc.". Escribí yesy presioné Enter. Luego 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 Intenta clonar con HTTPS en su lugargit clone https://github.com/fabiomaia/linuxify.git
Sí, eso funcionó. Actualice su respuesta (también, elimine esos dólares al principio; se copian cuando selecciona texto y copia y pega en la consola).
@izogfif Gracias por las sugerencias.

Como alternativa a la configuración de las variables de entorno PATH y MANPATH (que en realidad recomendaría), también es posible vincular binarios a una ubicación PATH existente como esta:

Necesita saber dónde Homebrew instala los coreutilsbinarios.

/usr/local/opt/coreutils/bin

El /usr/local/optdirectorio es donde Homebrew almacena archivos relativamente estáticos que es poco probable que cambien entre actualizaciones.

Luego puede crear enlaces simbólicos desde allí a una ubicación que ya está en su RUTA. Debe ser una ruta que se cargue temprano en la RUTA, porque la RUTA se busca por orden de llegada. /usr/local/bines una buena opción basada en mirar echo $PATH.

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

De esta manera, sería casi tan fácil crear enlaces simbólicos. En algunos casos, como cuando desea un control más estricto, es una buena opción en lugar de agregar un directorio completo a su PATH y MANPATH.