¿Reemplazar los comandos de shell de OS X con las versiones de Linux?

32

Los comandos disponibles por defecto en la Terminal en OS X, no parecen comportarse como sus versiones de Linux. ¿Cómo puedo reemplazarlos todos con los comandos GNU linux reales?

Por ejemplo, sed -i requiere un argumento "" adicionalmente molesto. Además, solo funciona con archivos de texto. Esto es inútil

El único
fuente
1
Umm ... sed es un "editor de texto", también puede modificar archivos binarios. ¿Qué más quieres que haga? Por favor explique qué es exactamente lo que necesita. No puedo entender tu problema, ¿podrías dar más ejemplos?
terdon
3
En realidad, sed es un editor de flujo . No para ser pedante, pero en realidad no está destinado a modificar archivos, a menos que esos archivos sean streams. Es precisamente por eso que la -ibandera no es estándar . edes para editar archivos.
kojiro

Respuestas:

43

En el caso general, no puede (o no debe ) reemplazar los comandos predeterminados en absoluto. La razón es que muchas secuencias de comandos de administración del sistema y paquetes de terceros probablemente se basan en estos comandos para comportarse de la manera en que funcionan de manera predeterminada en OS X.

Entonces, si simplemente borra los comandos del sistema y los reemplaza con equivalentes GNU que tienen un comportamiento incompatible o argumentos de línea de comando, probablemente romperá algo. Especialmente si usa 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 dependa de scripts de shell y comandos del sistema en lugar de llamar a las API de OS X.

Lo que puede hacer es instalar un entorno que instale las utilidades GNU en otro directorio sin sobrescribir los valores predeterminados, y luego ajustar su PATHvariable de entorno para que le dé prioridad a los comandos que se encuentran dentro del directorio GNU incluso antes de buscar en los directorios del sistema. Puede conectar esto para que solo establezca su RUTA de esa manera si está iniciando un shell interactivo; puede bashbuscar en Google cómo hacer esto o hacer otra pregunta en SU ​​(o buscarlo, ya que probablemente ya se le haya preguntado antes) si desea hacerlo.

Un ejemplo de dicho entorno es Homebrew que, por ejemplo, tiene GNU, sedentre otras cosas. Una vez que haya instalado Homebrew, puede escribir

brew install coreutils

e instale los GNU Coreutils . Estos le proporcionará sed, date, printf, wcy muchas otras herramientas que se incluyen con GNU / Linux, pero no OS X. Sin embargo, a fin de no "override" binarios OS X por defecto, van a tener el prefijo gpor defecto. Entonces, después de instalar Coreutils, si desea usar GNU sed, escriba

gsed

Si esto es demasiado complicado de escribir 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 desde sopas hasta nueces (kernel, X11, compatibilidad con syscall, etc.) tendrá que ejecutar Linux en una máquina virtual, como VirtualBox . Esta es una apuesta segura si necesita ejecutar software o scripts diseñados para ejecutarse en Linux.

Homebrew solo le brindará compatibilidad para ciertas clases de programas que no requieren un comportamiento específico de Linux. Por ejemplo, inotifysolo está disponible en Linux. drm(Direct Rendering Manager) solo está disponible en Linux. Hay algunas otras llamadas de sistema de bajo nivel que solo están disponibles en Linux, y para las cuales no existe un equivalente en OS X, por lo que portar ciertos programas de Linux a OS X puede ser poco práctico o imposible sin cambios significativos en el código.

allquixotic
fuente
Siempre hay Boot Camp . :)
kojiro
13
Por alguna razón brew install coreutilsno incluye sed. brew install gnu-sedSin embargo, puede hacer esto gsedy no se instala sed, incluso si actualiza su $PATH. Creé un enlace simbólico para ocultar Mac sed: ln -s $(which gsed) $(brew --prefix coreutils)/libexec/gnubin/sedsin embargo, aún debe hacerlo man gsedpara ver la página de manual correcta.
dimo414
66
brew install gnu-sed --default-nameslo instalará comosed
ivotron
1
En lugar de --default-names, puede instalar con los comandos con prefijo g y luego instalar oh-my-zsh (muy recomendable) y habilitar el complemento gnu-utils.
bibstha
3

Puede usar un Prefijo Gentoo que sea compatible con OS X, puede hacerlo arrancando y luego agregando las rutas relevantes en el directorio de prefijos a su RUTA. Puede ser que esto ya lo haga por ti. Después de hacerlo, puede usar los comandos estándar de Gentoo para instalar paquetes.

emerge coreutils obtendrá las utilidades GNU estándar, por ejemplo.

Tenga en cuenta que Gentoo compila de manera predeterminada, es posible que desee configurar un host binario en su lugar. Esto es sólo el uso de una de las direcciones URL en la segunda mitad de dicho artículo, y colocándolo en PORTAGE_BINHOST="... your url here ..."en ./etc/make.confen su prefijo.

Tamara Wijsman
fuente
1

Como seguimiento de la publicación de @ allquixotic, aquí están las instrucciones oficiales por brew install coreutils

Todos los comandos se han instalado con el prefijo 'g'.

Si realmente necesita utilizar 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 man con nombres normales, el directorio "gnuman" a su MANPATH desde su bashrc

MANPATH="/usr/local/opt/coreutils/libexec/gnuman:$MANPATH"
usuario72923
fuente
0

Con respecto a sedusted, puede descargar un binario precompilado del Rudixproyecto. Para más Rudixpaquetes ver aquí y aquí .

kerny
fuente