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 gawk
en Linux.
Los scripts también se usan /usr/xpg4/bin/grep
porque en Solaris grep
no se puede tomar la opción -q (silencio), pero grep de Linux sí y en este entorno /usr/xpg4/bin/grep
no 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 POSIX
los comandos compatibles (es decir, usar awk
, no nawk
o gawk
, grep
no /usr/xpg4/bin/grep
), las opciones y la sintaxis y configurarlos PATH
de 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/sh
shebang, que a pesar de la creencia popular esno POSIX
obediente. Simplemente no uses ningún shebang. Podría utilizarlo command -v sh
para ver qué POSIX
shell 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 POSIX
sintaxis 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.