2014-11-06 18 views
5
[email protected]:~$ test -x examples.desktop && echo $? 
[email protected]:~$ test -x examples.desktop & echo $? 
[1] 2992 
0 

Tại sao bash hoạt động theo cách đó trong tình huống này? Là lệnh kiểm tra đơn giản là không hoàn thành và do đó lệnh echo không được xử lý?& & amp; vs với lệnh kiểm tra trong bash

+1

Bạn làm không giải thích hành vi bạn mong đợi. Điều gì về điều này là đáng ngạc nhiên? Tại sao nó đáng ngạc nhiên? Những gì mong đợi nó mâu thuẫn? –

Trả lời

6

Ý nghĩa của &&& thực chất là khác nhau.

  • && trong bash là gì? Trong bash —và nhiều ngôn ngữ lập trình khác— && có nghĩa là “VÀ”. Và trong bối cảnh thực hiện lệnh như thế này, nó có nghĩa là các mục bên trái cũng như bên phải của && nên được chạy theo thứ tự trong trường hợp này.
  • & trong bash là gì? Và một đơn & có nghĩa là các lệnh trước — ở bên trái ngay lập tức của & — chỉ cần chạy dưới nền.

Vì vậy, nhìn vào ví dụ của bạn:

[email protected]:~$ test -x examples.desktop && echo $? 
[email protected]:~$ test -x examples.desktop & echo $? 
[1] 2992 
0 

Đầu tiên lệnh vì nó được cấu trúc-thực sự không trả lại bất cứ điều gì. Nhưng lệnh thứ hai trả về một [1] 2992 trong đó 2992 dùng để chỉ ID tiến trình (PID) đang chạy ở chế độ nền và 0 là đầu ra của lệnh đầu tiên.

Vì lệnh thứ hai chỉ chạy test -x examples.desktop ở chế độ nền, nó diễn ra khá nhanh nên ID tiến trình được sinh ra và biến mất khá nhanh.

2

& thực thi lệnh trong nền và trả về 0 bất kể trạng thái của nó.

Từ the man page:

Nếu một lệnh được chấm dứt bởi các nhà điều hành kiểm soát &, vỏ thực thi lệnh trong nền trong một subshell. Shell không chờ lệnh kết thúc, và trạng thái trả về là 0. Lệnh được phân cách bởi a; được thực thi tuần tự; vỏ chờ đợi cho mỗi lệnh để chấm dứt lần lượt. Trạng thái trả về là trạng thái thoát của lệnh cuối cùng được thực hiện.

2

Nhìn vào những gì các lệnh của bạn là:

$ test -x examples.desktop && echo $? 

Điều này có nghĩa kiểm tra để xem nếu examples.desktop là thực thi và nếu nó là sau đó thực hiện echo $?

$ test -x examples.desktop & echo $? 

phương tiện kiểm tra xem nếu examples.desktop là thực thi và chạy trong "nền" sau đó thực hiện echo $?

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