2010-10-06 37 views
6

Tôi đang viết một kịch bản shell trông như thế này:shell script của tôi dừng lại sau khi exec

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

Bây giờ, những gì tôi đang cố gắng để đạt được là liệt kê tất cả các tập tin trong $ ACTIONS_DIR để có thể thực hiện nó. Mỗi tệp trong $ ACTIONS_DIR là một tập lệnh shell khác.

Bây giờ, sự cố ở đây là sau khi sử dụng exec, tập lệnh dừng và không chuyển đến tệp tiếp theo trong dòng. Bất kỳ ý tưởng tại sao điều này có thể được?

Trả lời

5

exec thay thế quá trình shell. Hủy bỏ nó nếu bạn chỉ muốn gọi lệnh như là một tiến trình con thay thế.

3

exec chuyển quyền kiểm soát PID sang chương trình bạn đang thực hiện. Điều này chủ yếu được sử dụng trong các kịch bản có mục đích duy nhất là thiết lập các tùy chọn cho chương trình đó. Sau khi nhấn exec, không có gì bên dưới nó trong tập lệnh được thực hiện.

Ngoài ra, bạn nên thử một số kỹ thuật trích dẫn:

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

Bạn cũng có thể xem xét sử dụng find(1) cho hoạt động này:

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

'for i in" $ ACTIONS_DIR "/ *' sẽ an toàn hơn một chút nếu chúng tôi không biết tên thư mục không chứa khoảng trắng (hoặc nếu chúng tôi không biết/kiểm soát giá trị của 'IFS'). –

1

exec không bao giờ quay lại người gọi. Chỉ cần thử

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

'" $ i "' hoặc bạn sẽ có hành vi sai trái nếu tên chương trình chứa khoảng trắng. –

Các vấn đề liên quan