Hasta este mes, mis configuraciones de shell han sido bastante simples (solo un .bashrc
o .bash_profile
con algunos alias principalmente), pero lo he refactorizado para que pueda obtener un comportamiento diferente dependiendo de si estoy usando zsh y bash. Primero obtienen un archivo de configuración de shell genérico que debería funcionar para lo que sea, luego se especializan para el shell específico que se está utilizando (enlace simbólico a esto).
Hoy me sorprendió cuando ls
dejé de trabajar. Resultó que durante la refactorización .bashrc
, había un alias
alias ls='ls --color=always'
eso fue romper cosas para ls
bash en Terminal en OSX. Una vez que vi que a BSD ls
le gusta el -G
color, pero a GNU (o lo que sea que estaba en Ubuntu) le gusta --color
, quedó claro que algunas opciones difieren.
Mi pregunta es, ¿cuál es la mejor manera de explicar las diferencias en las opciones y tales entre los coreutils de BSD y GNU? ¿Debo probar una variable env en if
bloques para ver qué sistema operativo se está utilizando y aplicar el comportamiento correcto? ¿O tiene más sentido crear archivos de configuración separados para cada sistema operativo?
Si bien las respuestas a estas preguntas pueden ser subjetivas, parece que un resumen del alcance de las diferencias entre los coreutils de BSD y GNU y las estrategias para solucionarlos para hacer que una configuración genérica sea utilizable en la mayoría de * nix sería bastante objetivo.
ls -c
es diferente dels --color
. Editó su pregunta para arreglarla.Respuestas:
La única forma confiable de escribir scripts que admitan diferentes sistemas operativos es usar solo las características definidas por POSIX.
Para cosas como sus configuraciones personales de shell, puede usar hacks que se adapten a su caso de uso específico. Algo como lo siguiente es feo, pero logrará el objetivo.
fuente
coreutils
explícitamente, ¿por qué no solo probar si la bandera de color funciona, por ejemploif ls --color=auto -d / >/dev/null 2>&1; then ...
?Cubrir el código con
if
declaraciones para realizar un cambio en el tipo de coreutils funciona, sin embargo, la solución de programación limpia para manejar diferentes tipos es usar polimorfismo . Como se trata de Bash, no tenemos polimorfismo per se, pero he estado jugando con una forma de fingirlo. El único requisito es que su.bashrc
archivo, etc., esté organizado en funciones.Primero creo una prueba para el tipo de plataforma coreutils :
Luego podemos enviar según el tipo:
Aquí está la implementación de BSD :
(Tenga en cuenta que usamos la
CLICOLOR
variable para activar los colores en lugar de usar unalias
, que parece un poco más limpio)Y la impelementación de GNU :
Para completar, aquí hay una implementación de muestra de la "base abstracta":
fuente
ls
en su despachador en lugar de hacerlocat
, especialmente porque ninguno de sus alias implicacat
.--color=auto
en su segundo y tercer alias, ya que el primer alias agrega esa opciónls
.alias
era recursivo. Eso me permite hacer el ejemplo mucho más simple.No es una respuesta directa a su pregunta, pero tengo scripts de contenedor para manejar cosas como esta en lugar de complicaciones adicionales en el .bashrc Por ejemplo, aquí está mi script l que maneja su caso aquí de una manera multiplataforma:
http://www.pixelbeat.org/scripts/l
fuente