@xenoterracide: al menos unix.stackexchange.com/questions/3645/… . La respuesta de geekosaur es más completa, así que voté para cerrar la pregunta anterior.
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"):
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).
Compruebe si hay $BASH_VERSION, $ZSH_VERSIONy otras variables específicos del shell.
Cheque $SHELL; Este es un último recurso, ya que especifica su shell predeterminado y no necesariamente el shell actual .
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:
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.
-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.
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).
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 MYSHELLif[-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# verifyif[!-x "$MYSHELL"];then
MYSHELL=`command -v "$(ps $$ |awk 'NR == 2 { print $NF }')"`[-x "$MYSHELL"]|| MYSHELL="${SHELL:-/bin/sh}"# default if verify failsfi
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 ).
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)
echo #SHELL
no es del todo. Ver # 3 en la Respuesta de geekosaur .xterm -e /bin/cat
pero no estoy contento de llamar a/bin/cat
un shell.Respuestas:
Varias formas, de la más confiable a la menos confiable (y de la más "menos pesada"):
ps -p$$ -ocmd=
. (En Solaris, esto puede ser necesario enfname
lugar decmd
. En OSX y en BSD debería ser encommand
lugar decmd
).$BASH_VERSION
,$ZSH_VERSION
y otras variables específicos del shell.$SHELL
; Este es un último recurso, ya que especifica su shell predeterminado y no necesariamente el shell actual .fuente
$0
también?$0
porque 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.ps -p$$ -ocmd=""
es más bonita :-)$0
aún parece más útil que$SHELL
: ¿no estás de acuerdo? Siempre puede canalizarlosed
para eliminar el '-'.tcsh
,$tcsh
y$version
se establecerá. Estas son variables de shell, no variables de entorno. Si está ejecutando una versión no tcsh decsh
, 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.Descubrí que lo siguiente funciona en los cuatro shells que he instalado en mi sistema (bash, dash, zsh, csh):
Lo siguiente funciona en zsh, bash y dash, pero no en csh:
fuente
%self
se puede utilizar en lugar de$$
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:
fuente
Una nota sobre algunas implementaciones más ligeras (teléfonos Android, busybox, etc.):
ps
no siempre es compatible con el-p
conmutador, pero puede realizar la búsqueda con un comando comops | grep "^$$ "
. (Estagrep
expresión regular identificará de forma exclusiva el PID, por lo que no habrá falsos positivos.fuente
ps | grep $$
todavía puede dar falsos positivos si, por ejemplo, su proceso actual es1234
y hay un proceso12345
.Hay dos formas realmente simples:
Usando el comando ps :
o
dónde:
-h
o terminar todas las opciones con=
para no mostrar ningún encabezado.-o comm
para mostrar solo el nombre base del proceso (enbash
lugar 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 :
Esta opción se comporta exactamente como el
ps
comando anterior.o
Esto
/proc/PID/exe
enlaza 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
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
/proc
es realmente útil a través de/proc/self
, que se vincula al PID del comando actual.fuente
Una combinación de todas las otras respuestas, compatible con Mac (comm), Solaris (fname) y Linux (cmd):
fuente
csh
ytcsh
me daAmbiguous output redirect.
Si lo tiene guardado en sus variables de entorno, puede usar lo siguiente:
fuente
El pid del shell en ejecución viene dado por var $$ (en la mayoría de los shells).
Usando backticks para hacer que jsh (Heirlomm shell) funcione.
En muchos shells la prueba directa de
ps -o args= -p $$
obras, perobusybox ash
falla en eso (resuelto).La comprobación que
$1
debe 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
csh
tipo de conchas.fuente
/usr/lib/dyld
, una para/private/var/db/dyld/dyld_shared_cache_x86_64
.Configuré
$MYSHELL
para futuras pruebas en mi shell agnóstico~/.aliases
:La
tcsh
secció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,csh
las conchas de estilo no pueden funcionar2>/dev/null
o>&2
, como se señaló en la famosa diatriba de Csh de programación considerada perjudicial ).fuente
Simplemente puede usar el
echo $0
comando para verificar qué shell está utilizando y<name_of_the_shell> --version
para verificar la versión del shell. (ej.bash --version
)fuente
Esto también funciona:
fuente