¿Cómo mantener dotfiles system-agnostic?

21

Debido al trabajo, recientemente comencé a usar OS X y lo configuré usando homebrew para obtener una experiencia similar a la de Linux.

Sin embargo, hay bastantes diferencias en su configuración. Algunos solo necesitan estar en su lugar en un sistema. Como mis dotfiles viven en un repositorio git, me preguntaba qué tipo de conmutador podría establecer, de modo que algunas configuraciones solo se leen para el sistema Linux y otras para OS X.

En cuanto a los archivos de puntos, me refiero, entre otros, a .bash_profileso .bash_alias.

k0pernikus
fuente
Hice esto con ramas git. Tengo uno para FreeBSD, Gentoo y Ubuntu. Pero esto no es lo ideal.
Raphael Ahrens
@RaphaelAhrens Quiero evitar una solución basada en ramas, ya que es propensa a divergir.
k0pernikus
Sí, puedes hacerlo un poco más fácil cuando colocas las cosas específicas del sistema en archivos especiales. Pero como dije no es ideal.
Raphael Ahrens
stackoverflow.com/questions/394230/… Puede verificar Darwin en OS X.
Raphael Ahrens
Mi enfoque básicamente se reduce a if (exists rcfile.local); source rcfile.local; endif, traducido al archivo rc apropiado. El archivo rc principal que trato de mantener independiente del sistema, mientras que la .localversión tiene configuraciones específicas del sistema. Si lo quiere todo en un único repositorio, puede tener directorios del sistema y vincular el rcfile.local con el del directorio correcto.
jw013

Respuestas:

22

Mantenga los archivos de puntos lo más portátiles posible y evite configuraciones o conmutadores dependientes del sistema operativo que requieran una versión particular de una herramienta, por ejemplo, evite la sintaxis de GNU si no utiliza el software GNU en todos los sistemas.

Probablemente se encontrará con situaciones en las que es conveniente utilizar configuraciones específicas del sistema. En ese caso, utilice una instrucción de cambio con la configuración individual:

case $(uname) in
  'Linux')   LS_OPTIONS='--color=auto --group-directories-first' ;;
  'FreeBSD') LS_OPTIONS='-Gh -D "%F %H:%M"' ;;
  'Darwin')  LS_OPTIONS='-h' ;;
esac

En caso de que los archivos de configuración de aplicaciones arbitrarias requieran diferentes opciones, puede verificar si la aplicación proporciona conmutadores de compatibilidad u otros mecanismos. Por vimejemplo, puede verificar la versión y el nivel de parche para admitir características que las versiones anteriores o versiones compiladas con un conjunto de características diferente no tienen. Fragmento de ejemplo de .vimrc:

if v:version >= 703
  if has("patch769")
    set matchpairs+=“:”
  endif
endif
Marco
fuente
uname -ses como uname. uname significa nombre Unix.
Stéphane Chazelas
1
@StephaneChazelas Simplemente sucede o está garantizado en todos los sistemas y siempre puedo dejarlo -s?
Marco
1
Sí, unamesolo ha sido la forma canónica de hacerlo durante décadas y POSIX lo especifica. El original uname(en PWB Unix) no tomó ninguna opción.
Stéphane Chazelas
@StephaneChazelas Gracias por la aclaración, eliminé el -sde esta respuesta y lo tendré en cuenta para mis futuros scripts.
Marco
Es un detalle relativamente menor y no resta valor al punto ilustrado en su ejemplo, pero ¿se setsupone que esas citas en el vimrc son U + 201C y U + 201D en lugar de U + 0022?
un CVn
3

Si solo le preocupan los archivos que realmente se ejecutan, como .bash_profiles y amigos, puede salirse con la suya, por ejemplo, unamepara diferenciar según el sistema en el que se ejecuta el código.

Por ejemplo , completamente no probado y con la advertencia de que no tengo un OS X para probar cosas, si actualmente tienes en Linux:

alias ll='ls -lFA'

y en Mac OS X:

alias ll='ls -lFAx'

(donde -xhace que OS X lshaga algo que GNU ls hace por defecto), entonces se pueden combinar en algo como esto:

OS="$(uname -s)"
if test "$OS" = "Darwin"; then
    alias ll='ls -lFAx'
    # ...other OS X-specific things go here...
else if test "$OS" = "Linux"; then
    alias ll='ls -lFA'
    # ...other Linux-specific things go here...
fi
# ...generic things go here...

El único requisito es que uname -sfuncione de la misma manera (debería hacerlo, ya que ambos sistemas son razonablemente POSIX-yy uname -s es requerido por POSIX (gracias Marco por señalar esto )), y que la sintaxis para la ramificación del script de shell basado en una comparación de cadenas es lo mismo. Probablemente también pueda realizar pruebas según otros criterios; por ejemplo, puede buscar / etc / lsb_release, verificar si / proc / sys / kernel / ostype contiene "Linux", o cualquier otra prueba que se le ocurra.

un CVn
fuente
@RaphaelAhrens Es Darwin, acabo de comprobar.
k0pernikus
@RaphaelAhrens Como escribí, no tengo un OS X para probar las cosas, así que decidí mostrar la idea en lugar de perder mucho tiempo en un detalle relativamente insignificante que el OP puede descubrir trivialmente.
un CVn
Wikipedia al rescate en.wikipedia.org/wiki/Uname si alguien más quiere que haya bash para Windows u otras cosas.
Raphael Ahrens
1
El -oconmutador uname no es POSIX y falla en muchos sistemas, por ejemplo, Solaris. -ses obligatorio en POSIX y la forma más compatible. IEEE Std 1003.1
Marco
2
OSTYPEno está disponible en un shell POSIX. Fallará, por ejemplo, en una instalación predeterminada de FreeBSD y solo se puede usar en .bashrco .zshrc. No funciona de forma fiable en .profile, .alias, etc. Ya que estamos hablando de compatibiliy aquí, me gustaría asesoramiento a ir por el camino seguro, en lugar de confiar en las características particulares de la cáscara, que no están garantizados para estar disponible en todos los sistemas.
Marco