Estou usando bash ou sh? [duplicado]

6

Estou conectado a um shell remoto e muitas teclas não estão funcionando corretamente, como setas e a chave de escape. Esta resposta Teclas de seta, guia completa não está funcionando sugeriu que eu poderia estar no shell errado, então eu referenciei Como determinar o shell atual que eu sou trabalhando? . Usando os métodos descritos, obtenho resultados estranhos.

echo $SHELL 
/bin/bash

mas

echo $0
sh

Qual shell estou usando?

    
por Info5ek 17.09.2016 / 22:19

5 respostas

10

Use o sistema de arquivos proc para saber o nome do processo do shell

Em caso de dúvida, use o sistema de arquivos /proc . Há pastas por cada processo, com comm file, onde o comando desse processo é descrito. Então, sabendo o PID do shell, podemos saber qual é o shell.

$ echo $$
4824
$ cat /proc/4824/comm                                                          
mksh
$ bash
xieerqi@eagle:~$ echo $$
6197
xieerqi@eagle:~$ cat /proc/6197/comm
bash

Há também outros arquivos que você pode consultar para extrair as mesmas informações:

  • / proc / $$ / stat
  • / proc / $$ / status
  • / proc / $$ / cmdline
  • / proc / $$ / exe (link simbólico para o executável em si)

Isso pode não funcionar em kernels mais antigos ou sistemas que não suportam /proc filesystem (Mac OS X, por exemplo).

Variação na mesma abordagem com o comando ps

O comando

ps possui -p flag, que permite especificar pid. Ainda estamos usando a mesma ideia de referenciar a variável $$ para isso.

$ ps -p $$                                                                     
  PID TTY          TIME CMD
 7728 pts/5    00:00:00 mksh
$ bash
xieerqi@eagle:~$ ps -p $$
  PID TTY          TIME CMD
 7776 pts/5    00:00:00 bash

$0 vs $SHELL .

De acordo com Arch Wiki ,

% bl0ck_qu0te%

Em outras palavras, esse é o shell interativo padrão dos usuários, o mesmo que é definido em /etc/passwd . Essa também é a razão pela qual a variável $ SHELL não muda para subshells . Por exemplo, não importa quantos shells eu desovar, $SHELL variable não foi alterado:

$ echo $SHELL                                                                  
/bin/mksh
$ bash --posix
bash-4.3$ echo $SHELL
/bin/mksh
bash-4.3$ dash 
$ echo $SHELL
/bin/mksh
O argumento

$0 exibirá o "self" - o comando com o qual um programa ou nome do arquivo. Então, um script simples como este:

#!/bin/bash
echo $0

fornecerá uma saída assim:

$ ./test_script.sh                                                             
./test_script.sh

Isso também fica evidente quando você faz algo assim:

$ echo 'one two three' | xargs bash -c 'echo $0' 
one

Para todos os shells, a opção -c coloca o primeiro argumento de linha de comando em $0 variable.

No que diz respeito ao shell interativo, $ 0 normalmente seria suficiente, mas como você pode ver, não é uma maneira confiável de saber qual shell você está usando. Conhecer o processo é muito mais confiável

    
por Sergiy Kolodyazhnyy 17.09.2016 / 22:36
10

Você está usando sh . Porque $SHELL refere-se ao shell de login, não ao atualmente em uso.

O seu link da pergunta StackOverflow fornecido tem o método correto para determinar corretamente o shell atualmente em execução.

    
por Anwar 17.09.2016 / 22:25
4

Se o sistema operacional remoto for Ubuntu (ou outra distribuição baseada em GNU / Linux), uma maneira muito simples de descobrir qual shell você está executando é executar este comando:

ls -l /proc/$$/exe

se o sistema operacional remoto for não Ubuntu ou pelo menos uma distribuição GNU / Linux similar, você perguntou no site errado.

Se por algum motivo o sistema operacional remoto estiver com falta de /proc (por exemplo, executando uma versão simplificada, incompleta ou antiga do Ubuntu ou talvez uma instância do sistema operacional em container), o comando acima mencionado não funcionará.

Olhando para $0 , você terá uma pista de que não é 100% confiável. Qualquer programa pode falsificar seu nome para outra coisa. Em qualquer caso, é muito improvável que você realmente execute sh (o verdadeiro shell Bourne), pois quase nunca é instalado no Linux, você pode estar executando um sh clone, provavelmente dash .

    
por jlliagre 17.09.2016 / 22:52
2

você parece estar usando sh. Para mudar para o bash você poderia simplesmente digitar "bash"

    
por Artful Aardvark 17.09.2016 / 22:25
1

Já existem muitas ótimas respostas, mas você também pode tentar emitir echo $BASH_VERSION . Se isso imprimir um número de versão, você está no bash. Se sair uma linha vazia, você está dentro de algum outro shell.

    
por Zoltan 18.09.2016 / 00:06

Tags