¿Cómo probar qué shell estoy usando en una terminal?

69

¿Cómo verificar qué shell estoy usando en una terminal? ¿Cuál es el shell que estoy usando en MacOS?

usuario5837
fuente
2
@xenoterracide: al menos unix.stackexchange.com/questions/3645/… . La respuesta de geekosaur es más completa, así que voté para cerrar la pregunta anterior.
Gilles 'SO- deja de ser malvado'
1
echo $ SHELL, no?
mundo inocente
@ mundo inocente No, echo #SHELLno es del todo. Ver # 3 en la Respuesta de geekosaur .
Basil Bourque
No estoy tan seguro de que "shell" tenga un significado bien definido. Por ejemplo, puede ejecutar xterm -e /bin/cat pero no estoy contento de llamar a /bin/catun shell.
Basile Starynkevitch
Además, algunos shells (como scsh ) no usan el shell POSIX como la sintaxis.
Basile Starynkevitch

Respuestas:

71

Varias formas, de la más confiable a la menos confiable (y de la más "menos pesada"):

  1. ps -p$$ -ocmd=. (En Solaris, esto puede ser necesario en fnamelugar de cmd. En OSX y en BSD debería ser en commandlugar de cmd).
  2. Compruebe si hay $BASH_VERSION, $ZSH_VERSIONy otras variables específicos del shell.
  3. Cheque $SHELL; Este es un último recurso, ya que especifica su shell predeterminado y no necesariamente el shell actual .
geekosaur
fuente
44
¿Deberías mencionarlo $0también?
Mikel
No me gusta $0porque es más complicado: (1) puede ser solo el nombre base, (2) puede tener '-' en el frente para designarlo como un shell de inicio de sesión.
geekosaur
ps -p$$ -ocmd=""es más bonita :-)
asoundmove
1
@geekosaur: tal vez sí, pero $0aún parece más útil que $SHELL: ¿no estás de acuerdo? Siempre puede canalizarlo sedpara eliminar el '-'.
iconoclasta
2
Si está ejecutando tcsh, $tcshy $versionse establecerá. Estas son variables de shell, no variables de entorno. Si está ejecutando una versión no tcsh de csh, no creo que haya ninguna variable distintiva. Y, por supuesto, la sintaxis utilizada para verificar las variables difiere entre csh / tcsh, por un lado, y sh / ksh / bash / zsh, por el otro.
Keith Thompson
41

Descubrí que lo siguiente funciona en los cuatro shells que he instalado en mi sistema (bash, dash, zsh, csh):

$ ps -p $$

Lo siguiente funciona en zsh, bash y dash, pero no en csh:

$ echo $0
Steven D
fuente
2
Tampoco funciona en peces.
Ron E
Creo que la respuesta de @jiliagre es probablemente usaría hoy. En el pescado %selfse puede utilizar en lugar de$$
Steven D
8

Como la pregunta solicita el shell utilizado y no habla sobre los posibles argumentos que se le pasan, aquí hay una forma de evitar mostrarlos:

$ ps -o comm= -p $$
ksh93 
jlliagre
fuente
6

Una nota sobre algunas implementaciones más ligeras (teléfonos Android, busybox, etc.): psno siempre es compatible con el -pconmutador, pero puede realizar la búsqueda con un comando como ps | grep "^$$ ". (Esta grepexpresión regular identificará de forma exclusiva el PID, por lo que no habrá falsos positivos.

palswim
fuente
77
ps | grep $$todavía puede dar falsos positivos si, por ejemplo, su proceso actual es 1234y hay un proceso 12345.
Keith Thompson
4

Hay dos formas realmente simples:

  • Usando el comando ps :

    ps -o comm= $$

    o

    ps -h -o comm -p $$

    dónde:

    • -ho terminar todas las opciones con =para no mostrar ningún encabezado.
    • -o commpara mostrar solo el nombre base del proceso (en bashlugar de /bin/bash).
    • -p <PID> lista solo procesa con la lista de formularios PID suministrada.
  • Usando el sistema de pseudoarchivo de información de proceso / proc :

    cat /proc/$$/comm

    Esta opción se comporta exactamente como el pscomando anterior.

    o

    readlink /proc/$$/exe

    Esto /proc/PID/exeenlaza al archivo que se está ejecutando, que en este caso apuntaría a / bin / bash, / bin / ksh, etc.

    Para obtener solo el nombre del shell, solo puede usar

    basename $(readlink /proc/$$/exe)

    Esta es la única opción que siempre dará el mismo resultado, incluso si está en un script, código fuente o terminal, como enlaces al binario del intérprete de shell en uso.

    Advertencia Debe tener en cuenta que esto mostrará el binario definitivo, por lo que ksh puede estar vinculado a ksh93 o sh a bash.

El uso de /proces realmente útil a través de /proc/self, que se vincula al PID del comando actual.

David Goitia
fuente
3

Una combinación de todas las otras respuestas, compatible con Mac (comm), Solaris (fname) y Linux (cmd):

ps -p$$ -o cmd="",comm="",fname="" 2>/dev/null | sed 's/^-//' | grep -oE '\w+' | head -n1
sebastien
fuente
esto me da mi nombre de directorio actual; también, debajo cshy tcshme daAmbiguous output redirect.
iconoclasta
2

Si lo tiene guardado en sus variables de entorno, puede usar lo siguiente:

echo $SHELL
jasonleonhard
fuente
Lo más probable es que devuelva el nombre de ruta del ejecutable de shell de su shell de inicio de sesión. Sin embargo, no es seguro que el shell de inicio de sesión sea lo que está ejecutando actualmente.
Kusalananda
1

El pid del shell en ejecución viene dado por var $$ (en la mayoría de los shells).

whichsh="`ps -o pid,args| awk '$1=='"$$"'{print $2}'`"
echo "$whichsh"

Usando backticks para hacer que jsh (Heirlomm shell) funcione.

En muchos shells la prueba directa de ps -o args= -p $$obras, pero busybox ashfalla en eso (resuelto).

La comprobación que $1debe ser igual a $$elimina la mayoría de los falsos positivos.

Los últimos ;:se utilizan para mantener el shell en ejecución para ksh y zsh.

Las pruebas en más sistemas ayudarán, por favor haga un comentario si no funciona para usted.

No funciona en cshtipo de conchas.


fuente
En OS / X, en mis pruebas, obtengo al menos 3 líneas, una para el shell, una para /usr/lib/dyld, una para /private/var/db/dyld/dyld_shared_cache_x86_64.
Stéphane Chazelas
Sí, ahora solo selecciona las entradas en / bin y / usr / bin
Stéphane Chazelas
@ StéphaneChazelas Tal vez es mejor ahora?
0

Configuré $MYSHELLpara futuras pruebas en mi shell agnóstico ~/.aliases:

unset MYSHELL
if [ -n "$ZSH_VERSION" ] && type zstyle >/dev/null 2>&1; then        # zsh
  MYSHELL=`command -v zsh`
elif [ -x "$BASH" ] && shopt -q >/dev/null 2>&1; then                # bash
  MYSHELL=`command -v bash`
elif [ -x "$shell" ] && which setenv |grep builtin >/dev/null; then  # tcsh
  echo "DANGER: this script is likely not compatible with C shells!"
  sleep 5
  setenv MYSHELL "$shell"
fi

# verify
if [ ! -x "$MYSHELL" ]; then
  MYSHELL=`command -v "$(ps $$ |awk 'NR == 2 { print $NF }')"`
  [ -x "$MYSHELL" ] || MYSHELL="${SHELL:-/bin/sh}"  # default if verify fails
fi

La tcshsección es probable prudente para rodar en un guión de estilo POSIX ya que es tan radicalmente diferente (por lo tanto el aviso, y cinco segundos de pausa). (Por un lado, cshlas conchas de estilo no pueden funcionar 2>/dev/nullo >&2, como se señaló en la famosa diatriba de Csh de programación considerada perjudicial ).

Adam Katz
fuente
-1

Simplemente puede usar el echo $0comando para verificar qué shell está utilizando y <name_of_the_shell> --versionpara verificar la versión del shell. (ej. bash --version)

Sachin C
fuente
Steven D ya lo mencionó
:)