script opciones mac example crear bash csh

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