2010-10-06 19 views
6

estoy escribiendo un script de shell que tiene este aspecto:Mi script se detiene después de exec

for i in $ACTIONS_DIR/* 
    do 
      if [ -x $i ]; then 
        exec $i nap 
      fi 
    done 

Ahora, lo que estoy tratando de lograr es hacer una lista de todos los archivos en $ ACTIONS_DIR a ser capaz de ejecutar eso. Cada archivo en $ ACTIONS_DIR es otro script de shell.

Ahora, el problema aquí es que después de usar exec el script se detiene y no va al siguiente archivo en línea. ¿Alguna idea de por qué podría ser esto?

Respuesta

5

exec reemplaza el proceso de shell. Quítelo si solo desea llamar al comando como un subproceso en su lugar.

3

exec transfiere el control del PID al programa que está ejecutando. Esto se usa principalmente en scripts cuyo único propósito es configurar opciones para ese programa. Una vez que se golpea el exec, no se ejecuta nada debajo de él en el script.

Además, debe probar algunas técnicas de cotización:

for i in $ACTIONS_DIR/* 
    do 
     if [ -x "$i" ]; then 
       "./$i" nap 
     fi 
done 

También puede ver en el uso find(1) para esta operación:

find $ACTIONS_DIR \ 
    -maxdepth 1 \ 
    -type f \ 
    -perm +0111 \ 
    -exec {} nap \; 
+1

'for i in "$ ACTIONS_DIR"/ *' sería un poco más seguro si no sabemos el nombre del directorio no contiene espacios en blanco (o si no sabemos/controlar el valor de 'IFS'). –

1

exec nunca regresa a la persona que llama. Solo trata de

 if [ -x $i ]; then 
       ./$i nap 
     fi 
+0

'" $ i "', o tendrá mala conducta si el nombre del programa contiene espacios en blanco. –

Cuestiones relacionadas