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.