Descobrir o que sh é [duplicado]

2

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.

    
por theoden 19.07.2015 / 19:48

1 resposta

3

Em distribuições populares:

$ which sh
/bin/sh
$ readlink -f /bin/sh
/bin/dash

Ou mais compacto:

$ readlink -f $(which sh)
/bin/dash

No entanto, alguns (especialmente sistemas embarcados ou builds initrd) têm seu shell diretamente compilado como / bin / sh ou é um hardlink (busybox)

    
por 19.07.2015 / 22:03