2012-06-18 12 views
9

a.sh¿Cómo se exporta una variable a través de un script de shell?

#! /bin/sh 
export x=/usr/local 

podemos hacer source ./a en la línea de comandos. Pero necesito exportar a través del script de shell.

b.sh

#! /bin/sh 
. ~/a.sh 

ningún error ... pero $x en la línea de comandos no mostrará nada. Entonces no obtuvo exportación.

¿Alguna idea de cómo hacerlo funcionar?


A.Sh

#! /bin/sh 
export x=/usr/local 
----------- 
[email protected]: ./a.sh 
[email protected]: echo $x 

[email protected]: <insert ....> 
+0

relacionado: http://superuser.com/questions/176783/what-is-the-difference-between-executing-a-bash-script-and-sourcing-a-bash-scrip#176788 – lesmana

Respuesta

17

No se puede hacer una exportación a través de un script de shell, debido a que un script se ejecuta en un proceso de shell niño, y sólo los niños de la concha niño heredaría la exportar.

La razón para usar la fuente es tener el shell actual ejecutar los comandos

Es muy común colocar comandos de exportación en un archivo como .bashrc el que una fiesta se usa como fuente en el arranque (o archivos similares para otras conchas)

Otra idea es que se puede crear un script que genera un comando de exportación, ya que es la salida:

shell$ cat > script.sh 
#!/bin/sh 
echo export foo=bar 
^D 
chmod u+x script.sh 

y luego tener la shell actual ejecutar esa salida

shell$ `./script.sh` 

shell$ echo $foo 
bar 

shell$ /bin/sh 
$ echo $foo 
bar 

(nota anterior que la invocación de la secuencia de comandos está rodeado por acentos abiertos, para causar la cáscara para ejecutar la salida del script)

+0

Gracias. ¿Cuál es el '^ D'? – CppLearner

+0

Escriba ctrl-D y luego regrese para terminar de escribir el archivo que está creando con el gato –

+0

Gracias. Actualicé mi publicación. Lo intenté, pero cuando imprimí, me dio una línea vacía. ¿No pasó nada? – CppLearner

1

Exportación de una variable en el medio ambiente sólo hace que la variable visible a procesos secundarios. No hay forma de que un niño modifique el entorno de su padre.

+0

Gracias por avisarme, Mark. – CppLearner

31

puede usar comandos de exportación en un script de shell y luego usar el comando 'fuente' a ejecutarlo en el proceso actual:

source a.sh 

espero que esto ayude.

+4

Corto, claro y correcto. –

+2

Esta respuesta debe tener un tilde – chicharito

+2

Esta respuesta debe tener un tic +1 – iownthegame

0

Otra forma de hacerlo (para robar/exponer sobre la idea anterior) es colocar el script en ~/bin y asegurarse de que ~/bin esté en su RUTA. Entonces puedes acceder a tu variable globalmente.Este es solo un ejemplo que uso para compilar mi código fuente Go que necesita la variable GOPATH para apuntar al directorio actual (suponiendo que esté en el directorio que necesita para compilar su código fuente):

From ~/bin/GOPATH:

#!/bin/bash 

echo declare -x GOPATH=$(pwd) 

a continuación, sólo hacer:

#> $(GOPATH) 

Así que ahora se puede utilizar $ (GOPATH) desde el interior de sus otras escrituras también, como encargo de la estructura secuencias de comandos que puede invocar automáticamente esta variable y declararlo sobre la marcha gracias a $ (pwd).

Cuestiones relacionadas