Tại sao đã làm; Sau & trả lại lỗi mã thông báo bất ngờ trong bash?


21

Tôi đã nhận được lỗi:

bash: lỗi cú pháp gần mã thông báo bất ngờ `; '

do lệnh sau:

evince foo.pdf bar.pdf &; emacs foo.tex &

Tôi có bất hợp pháp khi tách các lệnh với ;khi sử dụng &để làm nền cho một công việc không? Hoặc có một lý do khác điều này đã không làm việc?

Cảm ơn bạn.

Câu trả lời:


40

Bạn không cần dấu chấm phẩy. Sau khi được gửi đến nền, nó miễn phí để nhận lệnh khác.

evince foo.pdf bar.pdf & emacs foo.tex &

2
Điều này giúp tôi với một tuyên bố if sau 2h chửi thề. Nếu bất cứ ai cần điều này:if [ $(ps -ef |grep -c '[p]grep') -eq 0 ]; then nohup sleep 5 > /dev/null 2>&1</dev/null & fi
Oktav

13

BTW, vấn đề cốt lõi là các shell (có nguồn gốc từ Bourne) không cho phép các lệnh rỗng.

";" và "&" là các dấu kết thúc lệnh, nghĩa là fg và bg tương ứng. Vì thế "; ;" (hoặc ";" ở đầu dòng) cũng không hợp lệ.

(Dòng mới ngụ ý ";" nếu có lệnh chưa kết thúc, trừ khi bạn sử dụng "\" để tiếp tục dòng.)

Ngôn ngữ khác nhau rất nhiều về các chính sách này:

Ngôn ngữ có nguồn gốc C cho phép báo cáo trống.

Pascal và PERL có dấu phân cách, không phải dấu chấm dứt.


-3

Không, nó chỉ bối rối và không thể hiểu được ý của bạn.

Bạn cần nhóm & bằng lệnh mà bạn muốn đặt trong nền:

$ (evince foo.pdf bar.pdf &); emacs foo.tex &

Điều đó làm việc tốt. Thậm chí rõ ràng hơn sẽ là:

$ (evince foo.pdf bar.pdf &); (emacs foo.tex &)

Đặc biệt là nếu sau đó bạn muốn chuỗi nhiều lệnh hơn sau khi kết thúc.


1
Không cần phải sinh ra một subshell chỉ để biện minh cho việc sử dụng một dấu chấm phẩy không cần thiết. Dấu ngoặc đơn không chỉ là cú pháp; họ gây ra nhiều việc phải làm
chepner
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.