Es necesario actualizar los scripts de Shell para que puedan ejecutarse en diferentes versiones de *nix.

Es necesario actualizar los scripts de Shell para que puedan ejecutarse en diferentes versiones de *nix.

Tengo un montón de scripts ksh y csh que deben actualizarse para ejecutarse en diferentes versiones de *nix (red hat linux, hp ux, solaris). Los shells están montados en el hogar de cada uno de nuestros servidores y necesitamos que funcionen en cada entorno.

Tenemos problemas con algunos comandos particulares que no se encuentran en Linux. Por ejemplo, los scripts usan nawk, que deberían reemplazarse por gawken Linux.

Los scripts también se usan /usr/xpg4/bin/grepporque en Solaris grepno se puede tomar la opción -q (silencio), pero grep de Linux sí y en este entorno /usr/xpg4/bin/grepno existe.

No quiero tocar todos los scripts, así que estoy buscando una solución más global.

Intenté configurar alias, eso funciona. Pero sólo en modo interactivo. Parece que no se recomienda utilizar alias en los scripts...

Puedo agregar un enlace simbólico en los directorios del sistema, pero luego necesitaré derechos de administrador para administrar esta configuración 'simulada' y nuestra configuración ya no es portátil...

No estoy acostumbrado a la administración de sistemas, por lo que puedo perderme una solución estándar para este tipo de necesidad.

¿Qué puedo hacer para tener un script portátil sin tener que reescribirlos todos?

Respuesta1

El enfoque correcto es ceñirse a POSIXlos comandos compatibles (es decir, usar awk, no nawko gawk, grepno /usr/xpg4/bin/grep), las opciones y la sintaxis y configurarlos PATHde esa manera:

PATH=$(getconf PATH):$PATH

o en Solaris si se utiliza el shell Bourne heredado:

PATH=`getconf PATH`:$PATH

y eso es todo, los scripts iniciados allí deberían ejecutarse sin modificaciones. Evite el uso del #!/bin/shshebang, que a pesar de la creencia popular esno POSIXobediente. Simplemente no uses ningún shebang. Podría utilizarlo command -v shpara ver qué POSIXshell está disponible en su máquina.

Sin embargo, parece que desea mantener sin cambios sus scripts no portátiles. Luego, puede mantener el enfoque sugerido anteriormente para los comandos que utilizan la POSIXsintaxis y agregar una interfaz para que los comandos no portátiles se manejen en otros sistemas operativos. Como sus scripts utilizan shells de estilo Bourne o Csh, los alias y las funciones no serán portátiles, por lo que es mejor usar su propia biblioteca de scripts contenedores que coloque delante de su archivo PATH. Por ejemplo:

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

Respuesta2

En tal caso uso variables.

AWK=awk
GREP=grep

luego prueba el sistema operativo

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

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

y usar variable después

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

De esta manera tengo un solo script pero utilizable en todos los hosts.

información relacionada