2011-04-15 20 views
6

Tengo dos scripts que se ejecutan de forma independiente. primero, digamos que el guión A calcula algunos valores. Y quiero hacer eco de estos valores de otro script llamado B. Estos scripts no se llamarán entre sí. He usado la palabra clave export pero no funcionó. ¿Cómo puedo hacer esto?Exportación de variables entre el script de shell

+1

no Will '. script' hacer el truco? (Consulte http://www.linuxquestions.org/questions/linux-newbie-8/how-to-export-environment-variable-from-a-bash-script-344057/) – mlvljr

+0

@mlvljr Debe hacer de esto una respuesta porque era lo que necesitaba Gracias. – Rebs

+0

@ AdamGriffiths Bueno, estoy tratando de evitar la carrera de puntos de reputación aquí;) – mlvljr

Respuesta

6

Si he entendido el requisito entonces no pueden ambos guiones realizar fácilmente en el mismo shell secundario, de forma independiente, pero sin llamarse unos a otros, o sin necesidad de un archivo externo o tubo de la siguiente manera:

Digamos esta es su script1.sh

#!/bin/bash 
# script1.sh: do something and finally 
export x=19 

Y aquí nosotros su SCRIPT2.sh

#!/bin/bash 
# script2.sh: read value of $x here 
echo "x="${x} 

sólo los llaman en la misma sub-shell como esto

(. ./script1.sh && ./script2.sh) 

SALIDA:

x=19 
0

¿No puede leer un tercer archivo, digamos settings.sh con las variables comunes exportadas?

# common.sh 
export MY_PATH=/home/foo/bar/ 
export VERSION=42.2a 

y en ambos A y B source common.sh para cargar esos valores.

Tenga en cuenta que la exportación puede no ser necesaria en ese caso.

+0

No necesito un tercer archivo en realidad. – thetux4

0

Puede repetir los valores de los valores de los archivos, luego la otra secuencia de comandos puede leerlos. Si desea utilizarlo como un parámetro para algo, utilizar aposthrophe inversa:

echo `cat storedvalue` 

tener cuidado, si las dos secuencias de comandos se ejecutan al mismo tiempo, se pueden producir problemas de concurrencia, lo que puede causar raramente aparecen, místico- buscando errores

+0

Entonces, ¿cómo puedo pasar el valor de retorno de las secuencias de comandos A al script B? – thetux4

4
mkfifo /tmp/channel 

process_a.sh > /tmp/channel& 
process_b.sh < /tmp/channel& 

wait 

Por supuesto, también puede simplemente leer una sola línea cuando lo desee.

En bash hay coprocs, que también pueden ser lo que quieras. ejemplo al azar de this page

# let the output of the coprocess go to stdout 
{ coproc mycoproc { awk '{print "foo" $0;fflush()}' ;} >&3 ;} 3>&1 
echo bar >&${mycoproc[1]} 
foobar 

ksh tiene una característica similar, al parecer

+0

comunicación entre procesos separados es más fácil de hacer con los archivos, y un tubo con nombre proporciona una interfaz práctica similar a un archivo: 'A" FIFO "es un tipo de archivo especial que permite que los procesos independientes se comuniquen. –

+0

coproc es interesante. lo comprobaré. – thetux4

1

Piense en cada secuencia de comandos como una función: la función A calcula un valor y lo devuelve. No sabe quién lo llamará. La función B toma algún valor y lo repite. No importa quién produjo ese valor. Por lo tanto, la escritura A es:

#!/bin/sh 
# a.sh: Calculate something and return the result 
echo 19 

y el guión B es:

#!/bin/sh 
# b.sh: Consume the calculated result, which passed in as $1 
echo The result is $1 

Hacer ellas ejecutable:

chmod +x [ab].sh 

Ahora, podemos pegarlas en la línea de comandos:

$ b.sh $(a.sh) 
The result is 19 

Semánticamente, b.sh di no llame a a.sh. Llamó a.sh y pasó su resultado a b.sh.

0

En realidad todo lo que necesita es source puede omitir el prefijo export.

Mi caso de uso era un archivo de configuración específicos medio ambiente, ejemplo:

Dentro main_script.sh

THIS_DIR=`dirname $0` 
source $THIS_DIR/config_vars.sh 
# other commands 

Dentro config_vars.sh

Cuestiones relacionadas