2014-05-12 15 views
10

Tôi đang cố gắng thực thi một tập lệnh thực thi một tập lệnh EXPECT và một quá trình sinh ra có mã thoát trong đó. Nhưng tôi không thể lấy mã thoát của quá trình sinh ra thành tập lệnh chính. Tôi luôn nhận được không thành công.Làm cách nào để lấy mã thoát của quá trình sinh ra trong kịch bản shell mong đợi?

mong đợi kịch bản là:

[Linux Dev:anr ]$ cat testexit.sh 
#!/bin/bash 
export tmp_script_file="/home/anr/tmp_script_temp.sh" 
cp /home/anr/tmp_script $tmp_script_file 
chmod a+x $tmp_script_file 
cat $tmp_script_file 
expect << 'EOF' 
set timeout -1 
spawn $env(tmp_script_file) 
expect { 
"INVALID " { exit 4 } 
timeout  { exit 4 } 
} 
EOF 
echo "spawned process status" $? 
rm -f $tmp_script_file 
echo "done" 

script Sinh ra:

[Linux Dev:anr ]$ cat tmp_script 
exit 3 

Thi hành Mong đợi kịch bản:

[Linux Dev:anr ]$ ./testexit.sh 
exit 3 
spawn /home/anr/tmp_script_temp.sh 
spawned process status 0 
done 

Vấn đề là tôi không thể lấy mã lối ra trở lại sinh ra để mong đợi kịch bản. Tôi muốn mã lối ra 3 kịch bản sinh ra để kịch bản chính và kịch bản chính nên thoát với mã exit 3.

Xin hãy giúp tôi để lấy mã thoát sinh ra để kịch bản chính.

+0

Thử đặt phần mong muốn vào một tệp riêng biệt, tức là tập lệnh mong đợi thực thi và thử và thoát trạng thái thoát. – PradyJord

+0

@ Jord, tôi phải viết phương thức mong đợi chỉ trong kịch bản lệnh shell. Nó không nên được thực thi riêng biệt. – ANR

+0

Tôi nhận được một số câu trả lời từ: [link] (https://stackoverflow.com/questions/3299502/how-to-return-spawned-process-exit-code-in-expect-script) nhưng không thể thâm nhập vào giải pháp đó ma cua toi. Tôi là con ong mới cho phương pháp mong đợi. – ANR

Trả lời

8

Với sự giúp đỡ của glenn, tôi có giải pháp ..và kịch bản cuối cùng của tôi là ::

mong đợi kịch bản là

[Linux Dev:anr ]$ cat testexit.sh 
#!/bin/bash 
export tmp_script_file="/home/anr/tmp_script_temp.sh" 
cp /home/anr/tmp_script $tmp_script_file 
chmod a+x $tmp_script_file 
cat $tmp_script_file 
expect << 'EOF' 
set timeout -1 
spawn $env(tmp_script_file) 
expect { 
"INVALID " { exit 4 } 
timeout  { exit 4 } 
eof 
} 

foreach {pid spawnid os_error_flag value} [wait] break 

if {$os_error_flag == 0} { 
    puts "exit status: $value" 
    exit $value 
} else { 
    puts "errno: $value" 
    exit $value 
} 
EOF 
echo "spawned process status" $? 
rm -f $tmp_script_file 
echo "done" 

script Sinh ra:

[Linux Dev:anr ]$ cat tmp_script 
exit 3 

Thi hành Mong đợi kịch bản:

[Linux Dev:anr ]$ ./testexit.sh 
exit 3 
spawn /home/anr/tmp_script_temp.sh 
exit status: 3 
spawned process status 3 
done 

Cảm ơn Glenn một lần nữa ..

+5

Và bạn có thể bày tỏ lòng biết ơn của mình: http://stackoverflow.com/help/someone-answers –

17

Bạn nhận được các trạng thái thoát của quá trình sinh ra với lệnh wait:

expect <<'END' 
log_user 0 
spawn sh -c {echo hello; exit 42} 
expect eof 
puts $expect_out(buffer) 

lassign [wait] pid spawnid os_error_flag value 

if {$os_error_flag == 0} { 
    puts "exit status: $value" 
} else { 
    puts "errno: $value" 
} 
END 
hello 

exit status: 42 

Từ expect man page

chờ [args]

trì hoãn cho đến khi một quá trình sinh ra (hoặc quá trình hiện tại nếu không được đặt tên) chấm dứt.

chờ thường trả về danh sách bốn số nguyên. Số nguyên đầu tiên là pid của quá trình đã được chờ đợi. Số nguyên thứ hai là id sinh sản tương ứng. Số nguyên thứ ba là -1 nếu xảy ra lỗi hệ điều hành hoặc 0 nếu không. Nếu số nguyên thứ ba là 0, số nguyên thứ tư là trạng thái được trả về bởi quá trình sinh ra. Nếu số nguyên thứ ba là -1, số nguyên thứ tư là giá trị của errno được thiết lập bởi hệ điều hành. Biến errorCode toàn cục cũng được thiết lập.


Thay đổi

expect { 
"INVALID " { exit 4 } 
timeout  { exit 4 } 
} 

để

expect { 
    "INVALID " { exit 4 } 
    timeout  { exit 4 } 
    eof 
} 

Sau đó, thêm lassignif lệnh.

+0

Cảm ơn bạn đã phản hồi nhanh @glenn .. Nhưng tôi vẫn nhầm lẫn với cách tôi triển khai/sử dụng lệnh 'wait' trong tập lệnh của mình. Bạn có thể giúp tôi pl .. – ANR

+0

Cảm ơn sự giúp đỡ @ glen. Tôi đã cố gắng để thực hiện các kịch bản mẫu mà bạn đưa ra nhưng tôi nhận được 'tên lệnh không hợp lệ" lassign "'. – ANR

+2

Kỳ vọng của bạn phải khá cũ. Sử dụng thay vào đó: 'foreach {pid spawnid os_error_flag value} [chờ đợi] break' –

0

Hãy chắc chắn để thoát khỏi $ trong đầu vào mong đợi để nó được diễn giải bởi trình bao.

+0

Đây là nhận xét cho câu trả lời khác. Vui lòng xem [nguyên tắc về câu trả lời] (https://stackoverflow.com/help/how-to-answer). Điều này được hiểu rằng bạn chưa có danh tiếng để bình luận về các câu hỏi/câu trả lời. Chiến lược tốt nhất để khắc phục vấn đề này là gì? Tham gia SO. – MrT

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