![SHELL="/bin/bash" frente a SHELL="bash"](https://rvso.com/image/1648608/SHELL%3D%22%2Fbin%2Fbash%22%20frente%20a%20SHELL%3D%22bash%22.png)
¿Cuál es la diferencia entre exportar SHELL="/bin/bash" y SHELL="bash"? Anteriormente tenía export SHELL="bash"
en mi .bashrc. Pareció funcionar. $($SHELL) generó un subshell, pero ssh con autenticación de clave pública dio el error:Shell "bash" is not executable: No such file or directory
Respuesta1
$($SHELL)
generó una subcapa
Sí, porque en un caparazón $SHELL
(omejor "$SHELL"
) se expande a /bin/bash
o bash
, en su caso, a ambos engendran Bash.
Nota al margen: cuando usa $($SHELL)
, la salida proveniente del nuevo shell se ejecutará después de que el shell salga porque así es como $( … )
funciona el comando de sustitución ( ). Sustitución de mandotiene poco sentidoaquí y no es necesario para mostrar su punto.
Su punto parece ser: cuando SHELL="bash"
ejecuta "$SHELL"
Bash, alguna otra herramienta (¿servidor SSH?) se queja.
No está claro qué herramienta se queja. Y no nos dijo si SHELL
fue manipulado en el lado del cliente o en el lado del servidor. No haymcveen la pregunta. Tampoco está claro por qué es necesario SHELL
configurar .bashrc
. No voy a investigar ninguno de estos.
Te voy a hablar de SHELL
la diferencia entre /bin/bash
ybash
en general.
El propósito de la SHELL
variable de entorno es apuntar al shell que desea utilizar. Varios programas pueden usar la variable (si está configurada) para intentar ejecutar el shell elegido por cualquier motivo. La diferencia que observó ocurre porque algunos programas se basan en elPATH
Variable ambiental, algunos no.
La dependencia de PATH
funciona de la siguiente manera. Hay una cadena que "codifica" qué ejecutable ejecutar. Por ejemplo, la cadena puede ser /bin/bash
, foo/bash
o bash
. Hay dos casos:
- Si la cadena contiene,
/
entonces la cadena misma se interpreta como una ruta absoluta (p. ej./bin/bash
) o relativa (p. ej.foo/bash
) al ejecutable. - Si la cadena no contiene
/
(por ejemplobash
), solo especifica el nombre base del ejecutable. El resto de la ruta (es decir, los componentes del directorio) proviene dePATH
. Básicamente, es el primer directorio especificadoPATH
que contiene un ejecutable con el nombre base especificado. Dependiendo dePATH
,bash
se puede resolver como/bin/bash
,/home/you/bin/bash
,./bash
(casi nunca) o nada en absoluto (dando ustedcommand not found
o un error similar).
Los shells dependen PATH
, por lo tanto, en un shell bash
(escrito literalmente o que aparece a partir de la expansión de $SHELL
o lo que sea) se encuentra /bin/bash
o /some/other/path/to/bash
en un sistema correctamente configurado.
Las herramientas que no dependen de PATH
tratan la cadena como una ruta (nombre de ruta). Esto no hace ninguna diferencia para una cadena que contiene /
. Hace una gran diferencia para una cadena que no contiene /
. Si la cadena es bash
y se interpreta directamente como una ruta, es equivalente a ./bash
lo que significa "archivo nombrado bash
en el directorio de trabajo actual".
Lo que sea que le dio el error aparentemente recuperó el contenido de la SHELL
variable y lo usó como ruta sin depender de la PATH
variable.
Esto era lo correcto. Nota POSIXespecificaSHELL
como:
Esta variable representará un nombre de ruta del intérprete de lenguaje de comandos preferido del usuario.
Investigar "nombre de ruta" y "resolución de nombre de ruta", estos no dependen de PATH
. Cualquier herramienta que utilice la SHELL
variable tratará su contenido directamente como un nombre de ruta.
Cuando SHELL="bash"
, en un shell "$SHELL"
ejecuta Bash solo porque $SHELL
se expandecomo cualquier otra variabley luego bash
es tratadocomo cualquier otro comando que no contenga/
. Entonces es un poco incidental.
Si interpreto correctamente la documentación POSIX, debería usarla SHELL="bash"
solo si quiere decir SHELL="./bash"
. Incluso si te refieres a esto, es mejor usar una ruta con /
, de modo que la mecánica en un shell donde PATH
se puede usar no interfiera con la forma en que SHELL
se interpretará.
Lo más probable es que no quieras ./bash
. Quieres /bin/bash
usar exactamente esto.