2013-06-03 42 views
24

Tôi đã cố gắng tìm cách chạy nhiều lệnh song song trong sh và đợi cho đến khi hoàn thành. Tôi đã phát hiện ra rằng đây không làm việc (sh: 1: Syntax error: ";" unexpected):dấu gạch ngang hai dấu chấm phẩy (;;) cú pháp

sh -c '(sleep 3 && echo 1) & ; (sleep 3 && echo 2) & ; wait' 

Nhưng cú pháp này hoạt động như mong đợi:

sh -c '(sleep 3 && echo 1) & ;; (sleep 3 && echo 2) & ;; wait' 

Nhưng tôi không hiểu sự khác biệt là gì. Câu hỏi của tôi là ý nghĩa của ;; và khi nào nó nên được sử dụng?

+3

không có dòng lệnh nào hoạt động ở đây. ';;' là dấu tách tùy chọn cho câu lệnh 'case'. – Kent

+0

xin lỗi, tôi đã sai, nó thực sự cho lỗi trong bash, nhưng hoạt động trong dấu gạch ngang – valodzka

Trả lời

35

;; chỉ được sử dụng trong các cấu trúc case, để cho biết kết thúc của giải pháp thay thế. (Đó là hiện nay, nơi bạn có break trong C.)

case $answer in 
    yes) echo 'yay!';; 
    no) echo 'boo!';; 
esac 

Cú pháp, ;& cả đánh dấu sự kết thúc của một lệnh. Một dòng mới tương đương với ;, trong lần gần đúng đầu tiên. Sự khác biệt giữa chúng là ; hoặc dòng mới chỉ ra rằng lệnh phải được thực thi ở nền trước, trong khi & cho biết lệnh phải được thực hiện trong nền.

Vì vậy, tại đây bạn cần & wait. & ; là lỗi cú pháp (bạn không thể có lệnh trống). & ;; cũng là lỗi cú pháp; tro cho phép nó đi (như thể bạn đã viết chỉ &), nhưng bash phàn nàn. Rõ ràng sh của bạn là một số biến thể tro (chẳng hạn như dấu gạch ngang, là /bin/sh trên nhiều dẫn xuất Debian).

+1

Trích dẫn bit quan trọng: Cú pháp, ';' và '& 'cả hai đánh dấu sự kết thúc của một lệnh. Vì vậy, ở đây bạn cần '& wait'. –

5

Cần được sử dụng trong tuyên bố case giữa các trường hợp. Vấn đề bạn đang gặp phải ở đây là cả hai &; là các dấu tách lệnh và bạn chỉ nên sử dụng một trong số chúng.

+0

Cảm ơn bạn đã làm rõ, 'sh -c '(ngủ 3 && echo 1) & (sleep 3 && echo 2) & wait'' đang làm việc như mong đợi. Nó không giải thích mặc dù những gì có nghĩa là ';;' trong bối cảnh này. – valodzka

+0

Bạn có chắc chắn 'sh' là' bash' không? –

+0

Xin lỗi, tôi đã sai, nó không phải là bash, nó [dash] (http://gondor.apana.org.au/~herbert/dash/) – valodzka

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