2013-01-17 38 views
7

Tôi đang cố gắng tạo một hàm trong một kịch bản lệnh shell có lệnh và thực thi nó bằng eval, sau đó thực hiện một số xử lý sau dựa trên thành công của lệnh. Thật không may mã không hoạt động như tôi mong đợi. Dưới đây là những gì tôi có:Lấy mã thoát cho lệnh eval trong sh

#!/bin/sh 

... 

function run_cmd() 
{ 
     # $1 = build cmd 

     typeset cmd="$1" 
     typeset ret_code 

     eval $cmd 
     ret_code=$? 

     if [ $ret_code == 0 ] 
     then 
       # Process Success 
     else 
       # Process Failure 
     fi 

} 

run_cmd "xcodebuild -target \"blah\" -configuration Debug" 

Khi lệnh ($cmd) thành công, nó hoạt động tốt. Khi lệnh không thành công (ví dụ: lỗi biên dịch), tập lệnh sẽ tự động thoát trước khi tôi có thể xử lý lỗi. Có cách nào tôi có thể ngăn chặn eval thoát khỏi, hoặc là có một cách tiếp cận khác nhau tôi có thể làm điều đó sẽ cho phép tôi đạt được hành vi mong muốn của tôi?

+2

không nên thoát tự động trừ khi bạn có 'set -e' ở đâu đó trong tập lệnh của mình. Nếu bạn có nó, 'set + e' sẽ vô hiệu hóa nó. –

+0

* sigh * Tôi đã có 'set -o errexit' kéo dài ở đầu tập lệnh người gọi. Cảm ơn bạn đã chỉ ra điều đó. – Jeff

Trả lời

13

Tập lệnh chỉ nên thoát nếu bạn có set -e ở đâu đó trong tập lệnh, vì vậy tôi sẽ giả định trường hợp đó. Một cách đơn giản hơn để viết các chức năng mà sẽ ngăn chặn set -e từ kích hoạt một lối ra tự động là để làm:

run_cmd() { 
     if eval "[email protected]"; then 
       # Process Success 
     else 
       # Process Failure 
     fi 
} 

Lưu ý rằng function là không cầm tay khi xác định chức năng, và không cần thiết nếu () cũng được sử dụng.

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