Tengo una pieza de software que requiere /bin/sh
ser Bash, pero para Ubuntu el valor predeterminado es Dash y quiero mantenerlo predeterminado; No quiero cambiarlo a Bash de forma permanente.
¿Hay alguna manera de cambiarlo solo para una sesión de terminal en ejecución? Entonces, ¿un programa que se ejecute en este terminal verá /bin/sh
vinculado a bash pero el resto del sistema seguirá viendo Dash? ¿O puedo engañar al software para que lo vea /bin/sh
como Bash aunque no lo sea?
No escribí este software y piratearlo para usarlo en /bin/bash
lugar de /bin/sh
no es realmente una opción.
command-line
bash
sh
corwin
fuente
fuente
/bin/sh
quebash
es un error y causa problemas reales (como lo está descubriendo). Si nadie se queja, es posible que nunca se cambie.Respuestas:
Dos respuestas ya sugieren monturas chrooting y bind, y hay una tercera opción estrechamente relacionada: montar espacios de nombres . Con el
unshare
programa , puede crear un nuevo espacio de nombres de montaje, y los montajes dentro de este espacio de nombres no afectarán a otros espacios de nombres.Por ejemplo, en una terminal, hago:
Y en otro:
Entonces podría ejecutar este programa inflexible en su propio espacio de nombres de montaje.
fuente
Si es un guión, simplemente llame al guión como
No es necesario cambiar los enlaces en absoluto.
Para el ejecutable compilado, puede ir a la ruta chroot:
Y luego ejecuta tu programa o
sudo chroot rootfs /yourprogram
Sin embargo, en la práctica no hay ninguna razón por la que no pueda usarlo
/bin/bash
como enlace simbólico/bin/sh
. De hecho, antes de la versión 6.10, Ubuntu usaba/bin/bash
como/bin/sh
, y luego cambiaron debido a/bin/sh
una implementación mucho más rápida y ágil de POSIX/bin/sh
(es decir, se adhiere al estándar POSIX sobre cómo deberían comportarse las utilidades del sistema operativo y el sistema operativo tipo Unix y implementar algunos de sus componentes internos), y debido a razones de portabilidad. Recomiendo leer la respuesta de Gilles también para notas históricas sobre cómo/bin/dash
surgió. En cuanto a la compatibilidad, los scripts escritos paradash
usar las funciones POSIX se ejecutarán conbash
un shell predeterminado perfectamente bien. Por lo general, es al revés lo que causa problemas:bash
tiene características que no son necesarias/bin/sh
, como la<<<
sintaxis o las matrices.Además, el comando en cuestión probablemente esté escrito con RHEL o CentOS en mente, que se utiliza
/bin/bash
como un enlace simbólico para/bin/sh
, sugiere dos cosas: probablemente apuntaron a un sistema operativo específico y no se adhirieron a los principios POSIX. En ese caso, también sería una buena idea verificar qué otras cosas requiere el comando, ya que si realmente está escrito con otro sistema operativo en mente, podría tener más problemas que simplemente volver a vincular/bin/sh
.fuente
ln
ocp -l
).mount --rbind --make-rslave
lugar decp -r
. También se puede hacer de solo lectura. Tambiénsudo chroot
ejecuta el script como root, lo que podría no ser óptimo.Una posibilidad sería un montaje de enlace de un solo archivo. Para ello, se monta el archivo
/bin/bash
simplemente sobre/bin/dash
lo quebash
tipo de cubiertas o cuerosdash
. Estos son los pasos (incluido el reverso):Sin embargo, no intenté ocultar
mount --bind /bin/bash /bin/sh
directamente el enlace simbólico. El truco anterior solo hace que bash y dash sean idénticos, por lo que se refiere a aunque apunta . Además, esta es una solución para todo el sistema, no solo para la ventana de terminal actual.mount
sh
bash
dash
Debo confesar que esto podría ser excesivo y que simplemente cambiar el enlace simbólico temporalmente es mucho más fácil. Solo quería mostrar otra forma posible.
fuente
Debería poder cambiarlo solo para la sesión actual utilizando un alias. Antes de ejecutar su comando en la terminal:
Esto será temporal y solo estará activo en el terminal desde el que se ejecutó.
SIN EMBARGO: Esto NO FUNCIONARÁ si su script usa rutas absolutas.
Desafortunadamente, "piratear" el script podría ser su única opción. Por convo con @vanadium, puede crear un script de envoltura como este:
Sin embargo, durante la duración de su script, es mejor que no espere que nada en su sistema requiera un guión explícito.
fuente