Escrevendo scripts que usam comandos diferentes em diferentes shells [duplicados]

3

Como posso escrever um script que seja independente do shell? Eu quero ser capaz de executar um script que será executado em ksh , sh e bash .

Por exemplo: se eu tiver uma linha no meu script como whence ls , que será executada em ksh e não em sh , quero poder ter algo como

if (ksh)
then whence ls
if (sh)
then whereis ls

Posso usar o valor $SHELL ou existe alguma outra maneira?

    
por user45783 23.08.2013 / 22:54

2 respostas

3

Um padrão que você normalmente verá com scripts de shell Unix é o uso de uma variável para os executáveis nomeados por sua função genérica, por exemplo, $ECHO . Você terá então uma ou duas funções de nível superior que determinarão a que $ECHO deve ser definido.

Quando $ECHO tiver sido definido, em todo o código, você verá isso:

$ECHO "hi"

Isso evita que você tenha que limpar seu código com muitos blocos if..then..else que não têm nada a ver com a funcionalidade de seus scripts e apenas com o interpretador de plataforma que está sendo usado.

Assim, você pode fazer o mesmo com qualquer programa-chave que esteja interessado em trocar, com base em qual interpretador / plataforma está sendo executado.

if (ksh)
then
  ECHO=echo1
  FILEFIND=whence
else if (sh)
  ECHO=echo2
  FILEFIND=whereis
else
  ECHO=echo3
  FILEFIND=which
fi

Você deveria fazer isso?

Eu diria que se você estiver tentando tornar seu script portátil e estiver preocupado com a disponibilidade de determinados intérpretes ou executáveis, é melhor codificar para o menor denominador comum, ou seja, /bin/sh .

Veja como a Oracle e outras pessoas fazem isso. Eles geralmente fornecem seus instaladores para que eles sejam roteirizados em /bin/sh . Este é o menor denominador comum quando você entra em suporte em vários Unixes, como Solaris, AIX e Linux.

Veja este guia criado pela Novell intitulado: Criando scripts para portáteis . Ele cobre a linhagem dos vários shells e o conjunto comum de comandos que estão em vários deles, com dicas sobre como lidar com suas sutilezas.

    
por 24.08.2013 / 00:22
0

você pode ter que realizar iniciando outro processo shell ...

if [ -x /bin/ksh ]
then
    output='/bin/ksh whence ls'
fi

if [ -x /bin/sh ]
then
    output='/bin/sh which ls'
fi
    
por 23.08.2013 / 23:53