opciones - menu linux bash
cómo generar un script csh en bash para establecer el entorno (9)
¿Qué tal si solo definimos una función llamada setenv?
setenv() {
echo setting $1 to $2
export $1=$2
}
y luego aprovisionando el archivo .cshrc.
Cuando hago esto en bash, me sale
[dws@oxygen ual-read-only]$ source cshrc
setting ORACLE_SID to TEST
setting ORACLE_HOME to /oracle/TEST/home/products/10204
setting EPC_DISABLED to TRUE
setting MANPATH to /usr/local/man:/usr/share/man
setting EDITOR to vi
setting LD_LIBRARY_PATH to /oracle/TEST/home/products/10204/lib:/usr/sfw/lib/64
setting NLS_LANG to AMERICAN_AMERICA.UTF8
setting NLS_DATE_FORMAT to DD-MON-RR
[dws@oxygen ual-read-only]$ env | grep ORACLE
ORACLE_SID=TEST
ORACLE_HOME=/oracle/TEST/home/products/10204
Tenemos Oracle ejecutándose en Solaris, y el shell es csh por defecto. Así que la secuencia de comandos de inicio de sesión establece oracle_home, oracle_sid en csh también. Pero no me gusta csh y quiero usar bash para hacer mi trabajo. Entonces, ¿cómo obtener el script de inicio de sesión csh en bash?
por ejemplo, lo siguiente es lo que en el archivo .cshrc. Y cuando use bash, me gustaría usar estas variables. Una forma es volver a copiar las variables y usar el comando bash, como exportar ORACLE_SID = TEST. Pero hacerlo requerirá que mantengamos dos copias de los archivos. Y cuando cambiamos el nombre de la base de datos, o actualizamos la base de datos, necesito mantener el archivo de inicio de sesión de bash por separado. Es bueno usar algo como
fuente .cshr en bash, pero no funciona.
setenv ORACLE_SID TEST setenv ORACLE_HOME /oracle/TEST/home/products/10204 setenv EPC_DISABLED TRUE setenv MANPATH /usr/local/man:/usr/share/man setenv EDITOR vi setenv LD_LIBRARY_PATH $ORACLE_HOME/lib:/usr/sfw/lib/64 setenv NLS_LANG AMERICAN_AMERICA.UTF8 setenv NLS_DATE_FORMAT "DD-MON-RR"
El solo hecho de tener un " #!/bin/tcsh
" o una declaración similar disponible al inicio de la secuencia de comandos CSH junto con la ejecución del script ejecutable solucionó el problema. Podría llamar directamente al script CSH desde bash en este caso.
Como ejemplo, tuve que ejecutar tools.csh desde un script de bash llamado setup.sh. Hice algo como esto en el guión de bash:
if [ -z /`head -1 tools.csh | grep ''^#!''/` ];
then
TCSH=/`which tcsh/`;
echo "''#!''$TCSH" > tools.csh.temp;
cat tools.csh >> tools.csh.temp;
mv tools.csh.temp tools.csh;
fi;
chmod 755 tools.csh;
./tools.csh
# now I have all the setenv commands effective ...
En tu .profile
bash, puedes hacer lo siguiente:
cat .cshrc | sed ''s/setenv/s+(/S+)/s+(.*)$/set $1=$2; export $1/'' > $HOME/.env_from_csh
source $HOME/.env_from_csh
Estoy en el mismo barco. Un compañero de trabajo me mostró lo siguiente:
Comience en bash, sin las cosas en el entorno:
bash> echo $$
12632
bash> echo $FOO
Aquí está el archivo csh que obtiene fuente:
bash> cat setup-env.csh
setenv FOO "some csh stuff"
echo FOO=$FOO in csh
Aquí está el comando:
bash> csh -c ''source setup-env.csh;exec bash''
Mira la salida de csh
FOO=some csh stuff in csh
Y mira la salida de la nueva shell bash
bash> echo $$
13487
bash> echo $FOO
some csh stuff
Ahora vete, y regresa al shell bash original.
bash> exit
exit
bash> echo $$
12632
bash>
Tenga en cuenta el eco $$ para ver los ID de proceso, de modo que podamos ver que son diferentes procesos de shell.
Mi compañero de trabajo usa esto lo suficiente como para ponerlo en un alias, como:
# make csh environment scripts useable (sourceable) from bash function
# from Phil McCoy, Wed Nov 9 2011
source_csh () {
exec csh -c " source $*; setenv ALREADY_SOURCED /"$ALREADY_SOURCED:$*:/"; exec bash"
}
# sounds like a great idea to do source_csh .cshrc or .login
# but naively done is infinitely recursive,
# since the exec''ed bash will run .bashrc
Desafortunadamente, he encontrado que a menudo necesitaba no solo la configuración de variables de entorno, sino también la configuración de alias, como en el paquete de módulos http://modules.sourceforge.net/ .
He podido automatizar estas "recetas de script de origen csh" utilizando Perl Expect. Pero no he podido ser tan interactivo como me gustaría, excepto por lo anterior.
Hay un módulo disponible mediante el cual puede obtener el mismo archivo donde quiera que desee en el script perl. Y obtendrá todas las rutas de entorno disponibles en su archivo csh.
Source::Shell
Ir a través de una pequeña documentación para su uso.
La única forma de pensar que puedo hacer es cargar csh y luego llamar a bash desde ese nuevo shell. De esa manera, csh podría analizar ese archivo, y luego el evento que genera heredaría ese entorno también.
Para algo tan pequeño, es común mantener dos scripts de configuración, uno para sh y derivados, shells y otro para csh y tcsh. Como mencionó, eso crea el riesgo de que los dos scripts no estén sincronizados, a menos que genere uno a partir del otro, o genere ambos a partir de una fuente común.
Esto coloca la carga en el mantenedor de los guiones de configuración en lugar de en cada usuario que necesita usarlos.
Sourcing de un archivo csh en bash no funcionará. Puede cambiar el shell de inicio de sesión predeterminado de csh a bash si está más cómodo en bash. Puedes usar chsh o como administrador para cambiarlo por ti.
chsh -s /usr/local/bin/bash
En su ~/.bashrc
(o el primero de ~/.bash_profile
, ~/.bash_login
, y ~/.profile
que existe) fuente este script usando algo como . ~/bin/sourcecsh
. ~/bin/sourcecsh
:
#!/bin/bash
# This should be sourced rather than executed
while read cmd var val
do
if [[ $cmd == "setenv" ]]
then
eval "export $var=$val"
fi
done < ~/.cshrc
Esta versión elimina la eval
mal:
#!/bin/bash
# This should be sourced rather than executed
# yes, it will be sourcing within sourcing - what so(u)rcery!
source /dev/stdin < /
<(
while read cmd var val
do
if [[ $cmd == "setenv" ]]
then
echo "export $var=$val"
fi
done < cshrc
)
Editar:
Sin fuente de aprovisionamiento:
while read cmd var val
do
if [[ $cmd == "setenv" ]]
then
declare -x "$var=$val"
fi
done < cshrc