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

1

Eu tenho um monte de scripts ksh e csh que precisam ser atualizados para serem executados em diferentes tipos de * nix (red hat linux, hp ux, solaris). As conchas são montadas na casa de cada um dos nossos servidores e precisamos tê-los trabalhando em cada env.

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

Scripts também usam /usr/xpg4/bin/grep porque em solaris grep não pode pegar a opção -q (silenciosa), mas o grep do linux pode e neste env /usr/xpg4/bin/grep não existe.

Não quero tocar 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 ...

Eu posso adicionar symlink nos diretórios do sistema, mas então eu precisarei dos direitos de administrador para gerenciar essa configuração 'mocking' e a nossa configuração não será mais portátil ...

Eu não estou acostumado com o administrador do sistema, então posso perder uma solução padrão para esse tipo de necessidade.

O que posso fazer para ter um script portátil sem reescrevê-los todos?

    
por Guillaume 26.10.2016 / 12:35

2 respostas

2

A abordagem correta é manter os comandos POSIX compatíveis (ou seja, usar awk , não nawk ou gawk , grep , não /usr/xpg4/bin/grep ), opções e sintaxe e definir seu PATH assim:

PATH=$(getconf PATH):$PATH

ou no Solaris se estiver usando o shell Bourne legado:

PATH='getconf PATH':$PATH

e é isso, seus scripts iniciados por lá devem ser executados sem modificações. Evite usar o #!/bin/sh shebang, que apesar da crença popular é não POSIX compliant. Apenas não use shebang em tudo. Você pode usar command -v sh para ver o que o POSIX shell está disponível em sua máquina.

No entanto, parece que você deseja manter seus scripts não portáveis inalterados. Em seguida, você pode manter a abordagem sugerida anteriormente para comandos usando a sintaxe POSIX e adicionar um front-end para os comandos não portáteis a serem manipulados em outros sistemas operacionais. Como seus scripts estão usando shells de estilo Bourne ou Csh, aliases e funções não serão portáteis, é melhor usar sua própria biblioteca de scripts de wrapper que você coloca na frente de seu 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
    
por 26.10.2016 / 13:28
1

Nesse caso, eu uso variáveis

AWK=awk
GREP=grep

teste para 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 variável após

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.

    
por 26.10.2016 / 13:16