Precisa atualizar scripts de shell para que possam ser executados em diferentes sabores *nix

Precisa atualizar scripts de shell para que possam ser executados em diferentes sabores *nix

Eu tenho vários scripts ksh e csh que precisam ser atualizados para rodar em diferentes sabores *nix (red hat linux, hp ux, solaris). Os shells são montados na home de cada um de nossos servidores e precisamos que eles funcionem em cada ambiente.

Temos problemas com alguns comandos específicos que não são encontrados no Linux. Por exemplo, scripts usam nawk, que deve ser substituído por gawkno Linux.

Os scripts também são usados /usr/xpg4/bin/grep​​porque no solaris grepnão pode usar a opção -q (quiet), mas o grep do linux pode e neste ambiente /usr/xpg4/bin/grepnão existe.

Não quero mexer em todos os scripts, por isso estou procurando uma solução mais global.

Eu tentei configurar aliases, isso funciona. Mas apenas no modo interativo. Parece que não é aconselhável usar aliases em scripts...

Posso adicionar um link simbólico nos diretórios do sistema, mas precisarei de direitos de administrador para gerenciar essa configuração 'simulada' e nossa configuração não é mais portátil ...

Não estou acostumado com administração de sistemas, então posso sentir falta de uma solução padrão para esse tipo de necessidade.

O que posso fazer para ter um script portátil sem reescrever todos eles?

Responder1

A abordagem correta é seguir POSIXcomandos compatíveis (ou seja, usar awk, not nawkou gawk, grep, not /usr/xpg4/bin/grep), opções e sintaxe e definir PATHdessa forma:

PATH=$(getconf PATH):$PATH

ou no Solaris se estiver usando o shell Bourne herdado:

PATH=`getconf PATH`:$PATH

e pronto, seus scripts lançados para lá devem rodar sem modificações. Evite usar o #!/bin/shshebang, que apesar da crença popular énão POSIXcompatível. Apenas não use nada. Você pode usar command -v shpara ver qual POSIXshell está disponível em sua máquina.

No entanto, parece que você deseja manter inalterados seus scripts não portáteis. Então você pode manter a abordagem sugerida anteriormente para comandos usando a POSIXsintaxe e adicionar um front end para que os comandos não portáveis ​​sejam manipulados em outros sistemas operacionais. Como seus scripts usam shells de estilo Bourne ou Csh, aliases e funções não serão portáveis, então é melhor usar sua própria biblioteca de scripts wrapper que você coloca na frente do seu arquivo PATH. Por exemplo:

sh/ksh/bash/...:

PATH=~/bin:`getconf PATH`:$PATH 

csh:

set path = ( ~/bin `getconf PATH` $path)

-

mkdir -p ~/bin
cd ~/bin
cat > awk <<%
#!/bin/sh
PATH=`getconf PATH`:$PATH awk "$@"
%
ln -s awk nawk
ln -s awk gawk

Responder2

Nesse caso eu uso variáveis

AWK=awk
GREP=grep

em seguida, teste o sistema operacional

if [ $(uname -s) == "SunOS" ]
then
  AWK=/usr/bin/nawk
  GREP=/usr/xpg4/bin/grep
fi

(repita para redhat, suse, hp-ux, aix)

e use a variável depois

if $GREP -q whatever /some/file
then
   $AWK -F: '{....}' /some/file
fi

dessa forma, tenho apenas um script, mas utilizável em todos os hosts.

informação relacionada