Como verificar qual shell estou usando em um terminal? Qual é o shell que estou usando no MacOS?
xterm -e /bin/cat
mas não estou feliz chamando /bin/cat
um shell.
Como verificar qual shell estou usando em um terminal? Qual é o shell que estou usando no MacOS?
xterm -e /bin/cat
mas não estou feliz chamando /bin/cat
um shell.
Respostas:
Várias maneiras, da mais à menos confiável (e da mais para a menos "pesada"):
ps -p$$ -ocmd=
. (No Solaris, pode ser necessário em fname
vez de cmd
. No OSX e no BSD, em command
vez de cmd
.)$BASH_VERSION
, $ZSH_VERSION
e outras variáveis específicas do shell.$SHELL
; esse é o último recurso, pois especifica seu shell padrão e não necessariamente o shell atual .$0
também?
$0
porque é mais complicado: (1) pode ser apenas o nome da base, (2) pode ter '-' na frente para designá-lo como um shell de login.
ps -p$$ -ocmd=""
é mais bonito :-)
$0
ainda parece mais útil do que $SHELL
: você não concorda? Você sempre pode canalizá-lo sed
para remover o '-'.
tcsh
, $tcsh
e $version
será definido. Essas são variáveis de shell, não variáveis de ambiente. Se você estiver executando uma versão não-tcsh csh
, acho que não há variáveis distintas. E é claro que a sintaxe usada para verificar as variáveis difere entre csh / tcsh, por um lado, e sh / ksh / bash / zsh, por outro.
Descobri que o seguinte funciona nos quatro shells que instalei no meu sistema (bash, dash, zsh, csh):
$ ps -p $$
O seguinte funciona no zsh, bash e dash, mas não no csh:
$ echo $0
%self
pode ser usado no lugar de$$
Uma observação sobre algumas implementações mais leves (telefones Android, busybox etc.): ps
nem sempre tem suporte para o -p
switch, mas você pode realizar a pesquisa com um comando como ps | grep "^$$ "
. (Esta grep
regex identificará exclusivamente o PID, portanto, não haverá falsos positivos.
ps | grep $$
ainda pode dar falsos positivos se, por exemplo, seu processo atual for 1234
e houver um processo 12345
.
Existem duas maneiras realmente simples:
Usando o comando ps :
ps -o comm= $$
ou
ps -h -o comm -p $$
Onde:
-h
ou finalizando todas as opções com =
para não mostrar nenhum cabeçalho.-o comm
por mostrar apenas o nome da base do processo (em bash
vez de /bin/bash
).-p <PID>
lista apenas o processo com a lista de formulários PID fornecida.Usando o sistema de pseudo-arquivos de informações do processo / proc :
cat /proc/$$/comm
Esta opção se comporta exatamente como o ps
comando acima.
ou
readlink /proc/$$/exe
Isso /proc/PID/exe
vincula o arquivo que está sendo executado, que neste caso apontaria para / bin / bash, / bin / ksh, etc.
Para obter apenas o nome do shell, você pode apenas usar
basename $(readlink /proc/$$/exe)
Essa é a única opção que sempre fornecerá o mesmo resultado, mesmo se você estiver em um script, código de origem ou terminal, como links para o binário do interpretador de shell em uso.
Aviso Você deve estar ciente de que isso mostrará o binário final, portanto o ksh pode estar vinculado ao ksh93 ou sh ao bash.
O uso de /proc
é realmente útil via /proc/self
, que vincula ao PID do comando atual.
Uma mistura de todas as outras respostas, compatíveis com Mac (comm), Solaris (fname) e Linux (cmd):
ps -p$$ -o cmd="",comm="",fname="" 2>/dev/null | sed 's/^-//' | grep -oE '\w+' | head -n1
csh
e tcsh
isso me dáAmbiguous output redirect.
Se você o salvou nas variáveis de ambiente, pode usar o seguinte:
echo $SHELL
O pid do shell em execução é dado pelo var $$ (na maioria dos shells).
whichsh="`ps -o pid,args| awk '$1=='"$$"'{print $2}'`"
echo "$whichsh"
Usando backticks para fazer o jsh (shell de Heirlomm) funcionar.
Em muitas conchas, o teste direto de ps -o args= -p $$
trabalhos, mas busybox ash
falha nisso (resolvido).
A verificação de que $1
deve ser igual a $$
remove a maioria dos falsos positivos.
O último ;:
são usados para manter o shell rodando para ksh e zsh.
Testes em mais sistemas ajudarão; por favor, comente se não funcionar para você.
Não funciona no csh
tipo de conchas.
/usr/lib/dyld
e uma para /private/var/db/dyld/dyld_shared_cache_x86_64
.
Fiz $MYSHELL
testes futuros no meu 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
A tcsh
seção é provavelmente imprudente rolar em um script de estilo POSIX já que é tão radicalmente diferente (assim o aviso a cinco segundos de pausa). (Por um lado, csh
conchas de estilo não podem fazer 2>/dev/null
ou >&2
, como observado no famoso discurso csh de programação considerado prejudicial .)
Isso também funciona:
env | grep SHELL