2010-10-06 18 views
6

Piszę skrypt, który wygląda tak:Mój skrypt zatrzymuje się po Exec

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

Teraz, co usiłuję osiągnięcia jest notować każdy plik w $ ACTIONS_DIR aby móc wykonać to. Każdy plik w katalogu $ ACTIONS_DIR jest kolejnym skryptem powłoki.

Problem polega na tym, że po użyciu exec skrypt zatrzymuje się i nie przechodzi do następnego pliku w linii. Jakieś pomysły, dlaczego tak się dzieje?

Odpowiedz

5

exec zastępuje proces powłoki. Usuń go, jeśli zamiast tego chcesz wywołać komendę tylko jako podproces.

3

exec przekazuje kontrolę nad PID do programu, który wykonujesz. Jest to głównie używane w skryptach, których jedynym celem jest skonfigurowanie opcji dla tego programu. Po uderzeniu w exec, nic pod nim w skrypcie nie jest wykonywane.

Ponadto, należy spróbować technik cytując:

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

Można również zajrzeć do korzystania find(1) do tej operacji:

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

for i in '„$ ACTIONS_DIR”/ *' byłoby nieco bezpieczniej, jeśli nie wiemy, nazwa katalogu nie zawiera spacje (lub jeśli nie wiemy/kontrolować wartość 'IFS'). –

1

exec nigdy nie wraca do osoby dzwoniącej. Wystarczy spróbować

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

'" $ i "', lub będziesz mieć złe zachowanie, jeśli nazwa programu zawiera białe znaki. –

Powiązane problemy