Estou escrevendo um conjunto de scripts que desejo portar, mas preciso saber se sh
na plataforma atual representa bash
, ksh
ou ash
. Existe uma maneira clara de fazer isso?
O que vem primeiro a minha mente é inspecionar qual shell possui qual --version
:
$ zsh --version
zsh 5.0.2 (x86_64-apple-darwin13.0)
$ bash --version
GNU bash, version 4.3.39(1)-release (x86_64-apple-darwin13.4.0)
Copyright (C) 2013 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software; you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
$ ksh --version
version sh (AT&T Research) 93u+ 2012-08-01
$ dash --version
dash: 0: Illegal option --
$ pdksh --version
pdksh: pdksh: --: unknown option
Além de ser desajeitado, isso nem sequer produz resultados em todos os casos.
Editar
Eu preciso disso para o meu projeto bashrc / zshrc /...-, onde atribuo meu shell de trabalho atual a uma variável e uso essa variável em todos os lugares.
Não posso postar meu código porque preciso resolver o problema para ativar a limpeza geral do meu trabalho. Além disso, seria muito código do macaco ... não entenda mal, mas a compatibilidade POSIX é muito estreita para tornar meu projeto pequeno o suficiente. Eu precisaria me prender nas configurações do sistema de outra forma.
No entanto, posso postar minha função de definição do UNIX Shell:
PROJ_GET_SHELL () {
local PROJ_SHELL="'ps -p $$ | tail -1 | tr ' ' '\n' | tail -1'"
PROJ_local=(pdksh bash dash mksh zsh ksh sh)
for i in ${PROJ_local[*]}
do
if ! [ -z 'echo $PROJ_SHELL | grep $i' ]
then
echo "$i"
break
fi
done
}
PS. O mínimo de pesquisa mostra que o $ SHELL não muda quando se executa um shell como subprocesso.