
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 gawk
no Linux.
Os scripts também são usados /usr/xpg4/bin/grep
porque no solaris grep
não pode usar a opção -q (quiet), mas o grep do linux pode e neste ambiente /usr/xpg4/bin/grep
nã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 POSIX
comandos compatíveis (ou seja, usar awk
, not nawk
ou gawk
, grep
, not /usr/xpg4/bin/grep
), opções e sintaxe e definir PATH
dessa 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/sh
shebang, que apesar da crença popular énão POSIX
compatível. Apenas não use nada. Você pode usar command -v sh
para ver qual POSIX
shell 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 POSIX
sintaxe 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.