Infelizmente, a edição atual dos padrões sh POSIX não oferece um sinalizador oficial de linha de comando nem uma variável de ambiente para acessar de forma confiável a versão do shell.
Felizmente, existem soluções alternativas. Pode-se tentar fornecer --version
para o shell, para a maioria dos derivados bash (exceto dash e posh). Ou echo "$BASH_VERSION"
(bash), echo "$ZSH_VERSION"
(zsh), echo "${.sh.version}"
(ksh).
Alguns pacotes diferenciam versões no nome de arquivo binário, como o nome do aplicativo de linha de comando do Python v3 é python3
. É possível que o nome do processo atual de um shell inclua a versão principal ou o caminho binário de um shell como /bin/sh
links para um caminho mais específico, como /bin/bash4.4.12
. Infelizmente, essa convenção não entrou na minúscula comunidade de desenvolvedores de shell, então é improvável que essas verificações produzam resultados úteis.
No entanto, o sistema de empacotamento pode apresentar um número de versão para o pacote de shell em questão. Portanto, execute dpkg -l <shell>
(derivadas do Debian), yum -l <shell>
(derivadas do RHEL), emerge -Opv <shell>
(Gentoo), pacman -Qi dash
(Arch), brew list dash
(Homebrew) e assim por diante. Se o shell em questão for sh
, esse shell provavelmente será fornecido pelo pacote coreutils, portanto, consulte o gerenciador de pacotes para coreutils
em vez de sh
.
Para RVM, cygwin e outros ambientes semelhantes a unix, o diretório que contém o shell pode nomear a versão do shell. Então pegue o caminho absoluto para o aplicativo shell e veja se o nome aparece lá.
Finalmente, o shell pode ser simplesmente fornecido pelo sistema operacional, portanto, uname -a; cat /etc/*release*
pode fornecer pelo menos algum tipo de identificador para rastrear a versão do shell.
Se todos esses comandos forem unidos com ponto-e-vírgula em um script, seria necessário ter uma força bruta razoavelmente abrangente, uma ferramenta semelhante ao nmap para identificar a versão de um determinado shell.