
Los comandos disponibles de forma predeterminada en la Terminal en OS X no parecen comportarse como sus versiones de Linux. ¿Cómo puedo reemplazarlos todos con los comandos reales de GNU Linux?
Por ejemplo, sed -i requiere un molesto argumento "" adicional. Además, sólo funciona con archivos de texto. Esto es inútil.
Respuesta1
En el caso general, no puedes (ono debería) reemplaza los comandos predeterminados. La razón es que muchos scripts de administración del sistema y paquetes de terceros probablemente dependen de estos comandos para comportarse como lo hacen de fábrica en OS X.
Entonces, si simplemente borra los comandos del sistema y los reemplaza con equivalentes de GNU que tienen un comportamiento incompatible o argumentos de línea de comando, probablemente se romperá algo. Especialmente si utiliza algún software que fue "portado" a Mac OS X después de haber sido diseñado originalmente para ejecutarse en Linux o BSD, ya que es más probable que este tipo de programas dependan de scripts de shell y comandos del sistema en lugar de llamar a las API de OS X.
Lo que tupoderLo que hay que hacer es instalar un entorno que instale las utilidades GNU en otro directorio sin sobrescribir los valores predeterminados, y luegoajusta tu PATH
variable de entornopara que dé prioridad a los comandos que se encuentran dentro del directorio GNU incluso antes de buscar en los directorios del sistema. Puede configurar esto para que solo establezca su RUTA de esa manera si está iniciando un shell interactivo; puedes buscar en Google cómo hacer esto bash
o hacer otra pregunta en SU (o buscarla, ya que probablemente ya se haya preguntado antes) si quieres hacerlo.
Un ejemplo de tal entorno escerveza caseraque por ejemplo tiene GNU sed
entre otras cosas. Una vez que haya instalado Homebrew, puede escribir
brew install coreutils
e instalar elGNU Coreutils. Estos le proporcionarán sed
, date
, y muchas otras herramientas que se incluyen con GNU/Linux, pero no con OS X. Sin embargo, para no "anular" los archivos binarios predeterminados printf
de wc
OS X, tendrán el prefijo g
predeterminado. Entonces, después de instalar Coreutils, si desea usar GNU sed, escriba
gsed
Si es demasiado complicado escribirlo cada vez, puede agregar un directorio "gnubin" a su RUTA y simplemente llamar a GNU sed con sed
. Deberá agregar lo siguiente a su ~/.bash_profile
:
PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"
Por supuesto, si necesita un entorno Linux completo (kernel, X11, compatibilidad con syscall, etc.), tendrá que ejecutar Linux en una máquina virtual, comoVirtualBox. Esta es una apuesta segura si necesita ejecutar software o scripts diseñados para ejecutarse en Linux.
Homebrew sólo le brindará compatibilidad con ciertas clases de programas que no requieren un comportamiento específico de Linux. Por ejemplo inotify
, sólo está disponible en Linux. drm
(Direct Rendering Manager) solo está disponible en Linux. Hay algunas otras llamadas al sistema de bajo nivel que sólo están disponibles en Linux y para las cuales no existe ningún equivalente en OS X, por lo que portar ciertos programas de Linux a OS X puede resultar poco práctico o imposible sin cambios significativos en el código.
Respuesta2
Podrías usar unPrefijo Gentooque es compatible con OS X, puedes hacerlo mediantearrancandoloy luego agregar las rutas relevantes en el directorio de prefijos a su RUTA. Puede ser que esto ya lo haga por ti. Una vez hecho esto, puede utilizar los comandos estándar de Gentoo para instalar paquetes.
emerge coreutils
obtendrá las utilidades estándar de GNU, por ejemplo.
Tenga en cuenta que Gentoo compila de forma predeterminada, es posible que deseeconfigurar un host binarioen cambio. Esto es simplemente usar una de las URL de la segunda mitad de ese artículo y colocarla PORTAGE_BINHOST="... your url here ..."
en ./etc/make.conf
su prefijo.
Respuesta3
Como seguimiento de la publicación de @allquixotic, aquí están las instrucciones oficiales porbrew install coreutils
Todos los comandos se han instalado con el prefijo 'g'.
Si realmente necesita usar estos comandos con su nombre normal, puede agregar un directorio "gnubin" a su RUTA desde su bashrc como
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
Además, también puede acceder a sus páginas de manual con nombres normales, el directorio "gnuman" de su MANPATH desde su bashrc.
MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"