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