2012-01-26 9 views
6

Soy un programador de C/C++ y bastante estúpido en general (o al menos la forma en que bash hace las cosas me hace sentir confundido) . No puedo comprender process substitution.Bash estableciendo una variable global dentro de un bucle y conservando su valor - O sustitución de proceso para dummys

Necesito definir un booleano global, establecerlo en algún lugar en un bucle, y hacer uso de él en el alcance global. ¿Podría alguien explicar por favor de la manera más simple posible cómo adaptar el código a continuación para permitirme lograr mi caso de uso, lo suficientemente simple como para no tener que contorsionar mi cerebro de nuevo mañana para tratar de captar la sustitución del proceso.

# DEFINE HERE 

for i in `seq 0 ${DAEMON_COUNT}`; 
do 
     if [ ! -d "data$i" ]; then 
# SET HERE 
       echo "data$i does not exist. Creating..."; 
       mkdir data$i 
     fi 
done 

# TEST AND USE HERE 

para ser honesto, no creo que bash esté a la altura ... el siguiente bloque se ve así.

echo "-------------------------------------------------------------------------------" 
echo "checking the state of potentially running daemons" 
for i in `seq 0 ${DAEMON_COUNT}`; 
do 
     if [ ! -e "data$i/mongod.lock" ] ; then 
       echo "[no lock file] mongod process $i does not exist" 
     else 
       echo "[lock file exists] process $i lock file exists " 
       I_PID=`cat data$i/mongod.lock` 

       if [ ! ${I_PID} ]; then 
         echo " [GOOD] lock pid empty" 
       elif [ "`ps -p ${I_PID} | grep ${I_PID}`" ]; then 
         echo " [GOOD] data1 pid: ${I_PID} running" 
       else 
         echo "[PROBABLY FATAL] data1 pid: ${I_PID} not running." 
       fi 
     fi 
done 
echo "-------------------------------------------------------------------------------" 

Lo que ahora necesito es una matriz global de estructuras de modo que pueda bucle sobre ellas y tomar medidas condicional para inicializar correctamente mis demonios: /.

Might just use libc and do this stuff in lua, la única razón por la que contengo es tener que instalar rocas, no me gusta ad hoc repositorios de código vómitos lo que quieran en mi máquina: D

Respuesta

1

que podría tener misundestood pero ...

bool=false; 

for i in `seq 0 ${DAEMON_COUNT}`; 
do 
    if [ ! -d "data$i" ]; then 
      bool=true; 
      echo "data$i does not exist. Creating..."; 
      mkdir data$i 
    fi 
done 

if [ $bool = true ]; then 
    ... 
fi 

¿Esto es lo que quieres?

+0

sí, que sería mi primera deseo. Mi segundo deseo es rastrear una matriz MxN de bools. –

8

Lo importante a comprender es esto: el proceso hijo nace con su propio entorno y no puede afectar las variables de su elemento primario. Si establece una variable en un proceso secundario, entonces el valor de la variable en el elemento primario no se ve afectado. En realidad, son dos variables diferentes que tienen el mismo nombre.

Lo segundo que debemos entender es cuando bash ejecuta un comando como un proceso secundario. Hay dos casos pertinentes a la pregunta:

  1. Cada proceso conectada por un tubo | es un hijo de la shell actual.
  2. La ejecución de un solo comando integrado con una redirección (por ejemplo, <) no generará un proceso secundario.

Aquí es una sesión simple que demuestra estas ideas:

$ somevar=initial 
$ echo test1 | read somevar 
$ echo $somevar 
initial 
$ read somevar < <(echo test2) 
$ echo $somevar 
test2 

La primera read es un proceso hijo y por lo tanto somevar en la cáscara principal no cambia. El segundo read es ejecutado por el propio shell principal y, por lo tanto, se actualiza somevar.

Esto significa que su código funcionará como se espera a menos que agregue un tubo delante o después del bucle for, es decir, este funciona como usted quiere que:

# DEFINE HERE 
SOMEVAR=0 
DAEMON_COUNT=10 

for i in `seq 0 ${DAEMON_COUNT}`; 
do 
     if [ ! -d "data$i" ]; then 
# SET HERE 
       SOMEVAR=10 
       echo "data$i does not exist. Creating..."; 
       mkdir data$i 
     fi 
done 

# TEST AND USE HERE 
echo ${SOMEVAR}  # This displays 10 
+0

¿el constructo 'for' genera implícitamente un proceso hijo? Ese fue el comportamiento que estaba experimentando cuando lo probé. –

+0

No. Por lo tanto, su código está realmente bien. Evite las tuberías, aunque :-) –

+0

imprime un cero en mi máquina :( –

Cuestiones relacionadas