2010-08-26 23 views

Trả lời

22

"echo 'hello' & & ls" có nghĩa là: thực hiện "ls" nếu "echo 'hello'" chạy thành công. Để hiểu những gì là "thành công" trong bash. Hãy thử điều này:

bash> cd/
bash> echo $?

nếu lệnh trước đó chạy thành công, bạn sẽ thấy 0

Sau đó, hãy thử này:

bash> asdfdf
bash> echo $?

Bạn sẽ thấy một giá trị khác không từ 1 đến 255. Điều này có nghĩa là lệnh trước đó đã không chạy thành công

Mặt khác, "echo 'hello'; ls" có nghĩa là thực hiện "ls" dù " echo 'hello' "chạy thành công hay không.

+7

Không, * không *, ** không ** nó sẽ * không * là một giá trị ngẫu nhiên. Đó là một giá trị * rất cụ thể *. Đó là lỗi "lệnh không tìm thấy" và 'echo $?' Sẽ cung cấp cho bạn 127 trong Bash, zsh, ksh, dấu gạch ngang và tro và có thể là những thứ khác. Các giá trị khác sẽ là * cụ thể * đối với loại lỗi (nhưng chúng có thể khác nhau trong một số trường hợp từ một vỏ này sang một trình bao khác). Giá trị là * không bao giờ *, * bao giờ * ** ngẫu nhiên **. –

+0

Cảm ơn bạn đã sửa. Đó thực sự là trạng thái thoát của lệnh trước đó và nó không bao giờ là ngẫu nhiên. Tôi tự hỏi đâu là danh sách trạng thái thoát được ghi lại. Hmmm .. –

+1

Tôi tin rằng chúng thường được ghi lại trong các trang hướng dẫn của các lệnh riêng lẻ, với trang bash man đưa ra một số lời khuyên chung. Kiểm tra phần 'EXIT STATUS' của 'man bash'. – Emily

4

Ở đây, chúng cũng giống nhau.

Nhưng lấy một ví dụ khác:

cp file target && ls 
cp file target; ls 

Trong trường hợp đầu tiên, ls sẽ chỉ được thực hiện nếu cp thành công. Trong trường hợp thứ hai, không có vấn đề gì nếu cp không thành công hoặc thành công, ls sẽ luôn được thực thi.

+0

Như DarkDust và telent đề cập, echo thực sự có thể thất bại, mặc dù nó thường không phải là một cái gì đó kịch bản sẽ quan tâm hoặc kiểm tra. – gamen

16

&& là toán tử logic AND. Ý tưởng trong việc sử dụng nó trong command1 && command2 là command2 chỉ được đánh giá/chạy nếu command1 thành công. Vì vậy, ở đây ls sẽ chỉ được chạy nếu lệnh echo trả về thành công (luôn luôn là trường hợp ở đây, nhưng bạn không bao giờ biết ;-). Bạn cũng có thể viết như sau:

if echo 'hello' 
then 
    ls 
fi 

Dấu chấm phẩy chỉ phân tách hai lệnh. Vì vậy, bạn cũng có thể viết echo 'hello' ; ls như:

echo 'hello' 
ls 

Như vậy ls cũng sẽ được thực hiện ngay cả khi echo thất bại.

BTW, thành công trong ngữ cảnh này có nghĩa là chương trình đã được thoát với một cái gì đó như exit(0) và do đó trả về 0 làm mã trả lại (biến số $? cho bạn biết trạng thái trả về của lệnh được thực thi cuối cùng).

+1

+1 Câu trả lời hay. –

8

Bổ sung DarkDust's answer:

Vì vậy, đây ls sẽ chỉ được chạy nếu lệnh echo trở thành công (mà sẽ luôn luôn là trường hợp ở đây, nhưng bạn không bao giờ biết ;-).

Vâng, không phải lúc nào. Ví dụ, dòng đầu ra tiêu chuẩn có thể unwritable

:; (echo "foo" && touch /tmp/succeeded) >/dev/full 
bash: echo: write error: No space left on device 
:; ls -l /tmp/succeeded 
ls: cannot access /tmp/succeeded: No such file or directory 
+0

Anh ấy, điểm tốt! Tôi đã không nghĩ về điều đó. – DarkDust

+3

+1: Gần hơn với mức độ nghiệp vụ đó :) –

+1

+1 Tôi nghĩ rằng điều này xứng đáng là câu trả lời chứ không phải là nhận xét vì đôi khi rất khó để đăng mã trong các nhận xét đầy đủ. –