¿Cómo verifico qué shell estoy usando?

359

Leí que el terminal no es más que shell, y Unix proporciona diferentes tipos de shells:

  • Bourne shell (sh)
  • C shell (csh)
  • TC shell (tcsh)
  • Korn shell (ksh)
  • Bourne Again shell (bash)

Preguntas:

  • Cuando abro una ventana de terminal, ¿qué shell se abre por defecto?
  • ¿Cómo verifico cuántos shells están instalados?
  • ¿Cómo cambio el shell utilizado desde mi cuenta?
LearNer969
fuente
@KasiyA Esto también está relacionado con askubuntu.com/questions/87853/…
daisy
Tenga en cuenta que el terminal es una interfaz para el shell (que en un punto solía ser en realidad una interfaz física), y el shell no es un terminal, es un intérprete de comandos. Ver también askubuntu.com/a/640105/295286
Sergiy Kolodyazhnyy

Respuestas:

429

Puede escribir el siguiente comando en su terminal para ver qué shell está utilizando:

echo $0

El resultado será similar al siguiente si está utilizando el terminal bash ( Bourne Again Shell ):

-bash
kingmilo
fuente
2
es 0una variable de entorno?
Mi_Onim
43
@Mi_Onim $ 0 es el nombre del proceso en ejecución. Si lo usa dentro de un shell, devolverá el nombre del shell. Si lo usa dentro de un script, será el nombre del script.
kingmilo
2
NOTA : esto no funcionará para interactivo csh. % echo $0 No file for $0., pero funciona paratcsh
Sergiy Kolodyazhnyy
2
No funciona si uno es enlace simbólico. Me gusta bashcomosh
Anwar
99
@Anwar hace un buen punto, después de obtener el nombre del shell echo $0, ls -l `which <name>` para ver si está vinculado a otro binario del shell.
JivanAmara
121

Para encontrar el shell que tiene en el entorno predeterminado, puede verificar el valor de la SHELLvariable de entorno:

echo $SHELL

Para encontrar la instancia de shell actual, busque el proceso (shell) que tiene el PID de la instancia de shell actual.

Para encontrar el PID de la instancia actual de shell:

echo "$$"

Ahora para encontrar el proceso que tiene el PID:

ps -p <PID>

Poniendo todo junto:

ps -p "$$"
heemayl
fuente
27
$ SHELL es el shell predeterminado para el sistema (o usuario), que generalmente es (pero no necesariamente) el shell que realmente se está utilizando en un momento dado.
kingmilo
1
@kingmilo: Correcto, respuesta modificada.
heemayl
Encontré esto bastante útil cuando cambié a un usuario a través de 'su - <nombre de usuario>', por ejemplo, para configurar postgres, jenkins, ...
bully
1
echo $SHELLme dio /bin/cshy ps -p $$me dio 22673 pts/1 00:00:00 bash. Kingmilo explicó (arriba) por qué no son lo mismo.
18446744073709551615
@ 18446744073709551615 Tampoco he dicho que sean lo mismo. Por favor lea la respuesta cuidadosamente nuevamente; tenga en cuenta la redacción predeterminada y actual .
heemayl
25

$SHELLte da el shell predeterminado. $0te da el shell actual.

Por ejemplo: tengo bash como mi shell predeterminado, que uso para mi aplicación Terminal. Pero para mi iTerm2 aplicación, utilizo el comando como se abre la ventana: /bin/ksh.

Entonces mi $0me da /bin/kshen iTerm2. $SHELLme da /bin/bashen iTerm2. $0, $SHELLMe da /bin/bashen la Terminal

thenakulchawla
fuente
2
Esta es una agradable desambiguación de las otras respuestas más votadas. Gracias.
Michael Hoffmann
Para mí, tengo instalado zsh y es el valor predeterminado actual, para cambiar a bash, todo lo que tengo que hacer es escribir bashen el terminal. Para volver a cambiar a zsh, escribazsh
Yousuf Azad
8

Para saber cuál es el shell predeterminado para su usuario, puede ejecutar:

echo "$SHELL"

Por ejemplo, si está utilizando Bash, debería obtener el siguiente resultado:

/bin/bash

Si no cambió ninguna configuración, debería ser Bash, ya que Bash es el shell predeterminado en Ubuntu.

kos
fuente
/ bin / sh es el lenguaje de comandos de Shell y no Bourne Shell, edite su respuesta.
kingmilo
@kingmilo No hay /bin/shreferencia en mi respuesta
kos
@kol había antes de editar. Tenga en cuenta también que $ SHELL es el shell predeterminado para el sistema (o usuario), que generalmente es (pero no necesariamente) el shell que realmente se está utilizando en un momento dado.
kingmilo
1
@kingmilo Leyendo la respuesta nuevamente creo que entiendo cuál es tu preocupación, probablemente no me expresé bien. Aclaré el significado de "actualmente" en mi respuesta
kos
1
@frederickjh fish es un poco extraño aquí. La $$variable en realidad está definida por POSIX y funcionará en la gran mayoría de los shells. Fish ha decidido no seguir el estándar aquí, así que creo que es justo ignorarlo. Puedo confirmar que $$funciona como se esperaba en sh, dash, bash, zsh, ksh, ash, tcsh y csh. De hecho, en la parte superior de mi cabeza no puedo pensar en ninguna otra concha, excepto en los peces donde no funciona.
terdon
8

Las otras respuestas tienden a usar funciones específicas de shell, pero estamos tratando de descubrir qué shell estamos utilizando, por lo que asumen la respuesta al problema. Por ejemplo, ninguna de las respuestas funcionará en peces.

sh -c 'ps -p $$ -o ppid=' | xargs ps -o comm= -p

En su lugar, use la sintaxis $$ en una invocación de sh, pero luego estamos buscando el PPID, no el PID. Use el PPID para encontrar el cmd.

sh -c 'ps -p $$ -o ppid=' | xargs -I'{}' readlink -f '/proc/{}/exe'

Gracias por mejorar @muru

Evan Benn
fuente
2
Puede usar ppid=/ cmd=para omitir los encabezados (y por lo tanto los tail -1s), y considere mirar /proc/.../exepara ver qué archivo se está ejecutando (ya que la cmdsalida puede ser manipulada por lo que sea que ejecute el shell).
muru
1
Aparentemente, esto no funciona en busybox, debido al incumplimiento de posix: ref: github.com/broadinstitute/cromwell/pull/…
Evan Benn
4

La publicación original hizo tres preguntas. Las respuestas dadas cubren la primera pregunta, "Cuando abro una ventana de terminal, ¿qué shell se abre por defecto?" También responden una pregunta que NO se hizo, a saber, "¿Cómo puedo averiguar qué shell se está ejecutando actualmente en el terminal?" Sin embargo, por lo que puedo ver, nadie ha respondido ni a la segunda ni a la tercera pregunta original, a saber, "¿Cómo verifico cuántos shells están instalados?" y "¿Cómo cambio el shell utilizado desde mi cuenta?"

  • Para responder "¿Cómo verifico cuántos shells están instalados?" El siguiente comando enumerará todos los shells disponibles:

gato / etc / conchas

Por ejemplo, en una instalación predeterminada de Ubuntu 18.10 esto da:

# / etc / shells: shells de inicio de sesión válidos

/ bin / sh

/ bin / dash

/ bin / bash

/ bin / rbash

Sin embargo, por defecto sh es un enlace simbólico al guión, mientras que rbash enlaza a bash con la opción -r ("bash restringido"), por lo que en realidad solo hay dos shells, no cuatro como sugiere la lista anterior. El siguiente comando le mostrará si alguno de los shells enumerados son en realidad enlaces simbólicos y, de ser así, dónde están vinculados: ls -l / bin

Michael D
fuente