Como testar qual shell estou usando em um terminal?

65

Como verificar qual shell estou usando em um terminal? Qual é o shell que estou usando no MacOS?

    
por user5837 18.03.2011 / 03:00

12 respostas

64

Várias maneiras, da mais para a menos confiável (e mais para a menos "pesada"):

  1. %código%. (No Solaris, isso pode precisar ser ps -p$$ -ocmd= em vez de fname . No OSX e no BSD deve ser cmd em vez de command .)
  2. Verifique as variáveis cmd , $BASH_VERSION e outras variáveis específicas do shell.
  3. Verifique $ZSH_VERSION ; este é um último recurso, pois ele especifica seu shell padrão e não necessariamente o shell atual .
por 18.03.2011 / 03:12
40

Descobri que o seguinte funciona nos quatro shells que eu instalei no meu sistema (bash, dash, zsh, csh):

$ ps -p $$

O seguinte funciona em zsh, bash e dash, mas não em csh:

$ echo $0
    
por 30.10.2010 / 22:06
8

Como a pergunta pede o shell usado e não fala sobre os possíveis argumentos passados para ele, aqui está uma maneira de evitar mostrá-los:

$ ps -o comm= -p $$
ksh93 
    
por 16.05.2013 / 02:33
6

Uma nota sobre algumas implementações mais leves (telefones Android, busybox, etc.): ps nem sempre tem suporte para a opção -p , mas você pode realizar a pesquisa com um comando como ps | grep "^$$ " . (Esse grep regex identificará exclusivamente o PID, portanto, não haverá nenhum falso positivo.

    
por 02.02.2012 / 22:03
4

Existem duas maneiras bem simples:

  • Usando o comando ps :

    ps -o comm= $$
    

    ou

    ps -h -o comm -p $$
    

    onde:

    • -h ou terminar todas as opções com = para não mostrar nenhum cabeçalho.
    • -o comm para mostrar apenas o nome da base do processo ( bash em vez de /bin/bash ).
    • -p <PID> list only process com a lista de formulários PID fornecida.
  • Usando o / proc processo de informações pseudo- sistema de arquivos:

    cat /proc/$$/comm
    

    Esta opção se comporta exatamente como o comando ps acima.

    ou

    readlink /proc/$$/exe
    

    Esse /proc/PID/exe é vinculado ao arquivo que está sendo executado, o que neste caso apontaria para / bin / bash, / bin / ksh, etc.

    Para obter apenas o nome do shell, basta usar

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

    Esta é 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, então o ksh pode estar vinculado ao ksh93 ou sh ao bash.

O uso de /proc é realmente útil através do /proc/self , que liga ao PID do comando atual.

    
por 24.08.2017 / 12:18
3

Uma mistura de todas as outras respostas, compatível com Mac (comm), Solaris (fname) e Linux (cmd):

ps -p$$ -o cmd="",comm="",fname="" 2>/dev/null | sed 's/^-//' | grep -oE '\w+' | head -n1
    
por 18.03.2014 / 01:23
1

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 trabalho jsh (Heirlomm shell).

Em muitos shells, o teste direto de ps -o args= -p $$ funciona, mas busybox ash falha nisso (resolvido).

A verificação de que $1 deve ser igual a $$ remove a maior parte dos falsos positivos.

Os últimos ;: são usados para manter o shell em execução para ksh e zsh.

Testes em mais sistemas ajudarão, por favor, faça um comentário se não funcionar para você.

Não funciona em csh tipo de shells.

    
por 07.09.2015 / 17:53
1

Se você salvou em suas variáveis de ambiente, você pode usar o seguinte:

echo $SHELL

    
por 22.05.2018 / 01:48
0

Eu defino $MYSHELL para testes futuros no meu agnóstico de shell ~/.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 seção tcsh é provavelmente imprudente para ser convertida em um script no estilo POSIX, já que é radicalmente diferente (assim, o aviso e uma pausa de cinco segundos). (Por exemplo, as conchas no estilo csh não podem fazer 2>/dev/null ou >&2 , como observado no famoso Csh Programming Considered Harmful rant.)

    
por 15.01.2015 / 17:52
-1

Você pode simplesmente usar o comando echo $0 para verificar qual shell está usando e <name_of_the_shell> --version para verificar a versão do shell. (por exemplo, bash --version ).

    
por 04.12.2015 / 09:30
-2
ps -p $$ | tail -n 1 | awk -F '\-' '{print $2}'
    
por 19.06.2014 / 15:22
-5

Isso também funciona:

env | grep SHELL
    
por 14.03.2012 / 17:57

Tags