Estoy buscando una forma simple y confiable de obtener el nombre del shell actual desde un script o un archivo de origen ( no desde la línea de comandos). Hubiera esperado hacerlo, $(basename "$SHELL")
pero si mi shell de inicio de sesión es zsh
y tengo el siguiente código en some_script.sh
this_shell=$( basename "$SHELL" )
echo "The Shell is $this_shell"
echo "The Shell is $0"
y lo ejecuto bash some_script.sh
, todavía aparece en zsh
lugar de bash
aunque el intérprete utilizado sea /bin/bash
. No estoy seguro de por qué los diseñadores de shell eligieron mostrar el shell predeterminado en lugar del shell actual, pero eso parece ser a lo que nos hemos quedado atrapados.
Hay algunas otras preguntas ligeramente similares ( aquí y aquí ), pero sus respuestas se quedan cortas de muchas maneras.
- A menudo asumen que el usuario está tratando de descubrir qué shell interactivo están usando actualmente, pero eso es una locura. Yo sé lo que estoy shell comandos de escritura en - Necesito código que se puede ejecutar en cualquier lugar para ser capaz de determinar qué shell se está utilizando.
- A menudo dan varias cosas diferentes para probar, nuevamente como si estuvieras en la línea de comando y solo puedes jugar hasta que aprendas que estás usando bash, pero necesito una sola cosa que sea confiable en todos los contextos.
- A menudo dan cosas que son completamente inútiles de los scripts, como
echo $0
. Eso falla como se muestra en el script anterior. (Sí, funciona en una línea de comandos de shell interactiva, pero ¿por qué no sabes qué shell estás usando?) - A veces dan comandos que (en mis pruebas limitadas) incluyen la información correcta, como
ps -p $$
, pero carecen de comandos sed / awk multiplataforma compatibles con shell cruzado para canalizarlo y obtener solo el nombre del shell e ignorar la otra información que aparece para el viaje. - Incluyen cosas que solo funcionarán en un par de conchas, como
$BASH_VERSION
y$ZSH_VERSION
. Quiero apoyar a la mayor cantidad posible de proyectiles, tales comofish
,csh
,tcsh
.
¿Cómo detecto de manera confiable y precisa cualquier shell actual ? Estoy buscando algo que funcione en todas las plataformas, en scripts y para la mayor cantidad de shells posibles y razonables 1 .
ACTUALIZACIÓN : Cuando publiqué esta pregunta, esperaba que hubiera alguna instalación integrada en los shells para darnos esta información, lo que parece no ser el caso. Dado que parece inevitable ahora confiar en algo fuera de los shells, debería hacer más explícito que estoy pidiendo unasolución multiplataforma (que, aunque implícito en mis objeciones a otras respuestas anteriores, podría ser fácil pasar por alto si no lo hace No leas la pregunta con cuidado).
Actualización 2 Si alguien todavía cree que este es un duplicado de la pregunta solo para Linux porque la respuesta de Stéphane no es solo para Linux, aquí están las diferencias entre lo que estoy pidiendo y lo que me ha proporcionado. (Tenga en cuenta que lo que ha escrito es ingenioso, y no lo estoy golpeando, pero no resuelve mi problema).
- Estoy buscando algo simple y confiable , que
- se puede agregar a cualquier secuencia de comandos o definición de función (que sería originada por un
.zshrc
o.bash_profile
o lo que sea) en rama. - No puede utilizar su secuencia de comandos como una utilidad externa que pasa el nombre del intérprete a la secuencia de comandos / función que realiza la llamada, ya que siempre será interpretada por el intérprete predeterminado y la devolverá. Esto hace que sea difícil o imposible de usar para mis propósitos. Si es posible, todavía es muy muy difícil, y la solución para hacerlo funcionar no se da en la respuesta. Por lo tanto, no respondió a mi pregunta, por lo tanto, no es un duplicado.
Si quieres ver algo que va a trabajar, echar un vistazo a ShellDetective en GitHub . Eso puede hacer que sea más fácil ver las diferencias entre lo que ya está presente en SE y lo que está buscando esta pregunta (y de hecho fue escrita para satisfacer las necesidades de esta pregunta, que no se habían satisfecho en ningún otro lugar).
(PS si no se puede creer que hay un caso de uso para esto, imagínese las funciones que se sourced en .zshrc
, .bash_profile
o .profile
dependiendo de lo que se está utilizando y qué servidor conchas que tiene disponibles. Están origen lo que no tienen línea de tinglado. Ellos son más útiles si pueden funcionar en cualquier shell, pero a veces tienen que saber en qué shell están para saber cómo comportarse).
1 No me interesan las "conchas" que no son conchas en ningún sentido tradicional de la palabra. No estoy preocupado por un caparazón que algún tipo escribió para sí mismo. Solo me preocupan los shells reales que realmente ocurren en la naturaleza, y que alguien podría tener que usar al iniciar sesión en un servidor en el que no pueden simplemente instalar los shells que quieran.
sh -c "…"
, y luego haga la mayor parte del trabajo en la sintaxis de shell POSIX.
fish
para ejecutar tu script, ¿quieres fish
o csh
?