Tôi bối rối không biết tại sao | đúng trong một makefile có tác dụng tương tự như | | thật"


13

Tôi có một tệp thực hiện khi tôi dừng dịch vụ trước khi xóa tệp. Khi không thể dừng dịch vụ, nó sẽ bị lỗi. Điều này rõ ràng là không mong muốn nên tôi nghĩ tôi đã thêm || truenhưng đã bỏ lỡ a |. Lam no:

stop service foo | true
rm /etc/init/foo.conf

Tôi bối rối không biết tại sao nó lại hoạt động và những gì đang xảy ra. Điều này có nghĩa là đó truelà một ứng dụng và không chỉ là một từ khóa? Họ có giống nhau không? Có một lý do tốt để sử dụng | true?

Câu trả lời:


16

truefalsecoreutils (cũng thường là các phần tử dựng sẵn) chỉ trả về 0 và không 0, cho các tình huống mà bạn tình cờ cần hành vi đó. Từ trang người đàn ông:

đúng - không làm gì, thành công
sai - không làm gì, không thành công

Vì vậy, bạn đang dẫn đầu ra từ stop service foovào true, bỏ qua nó và trả về 0. Về mặt kỹ thuật nó hoạt động, nhưng có lẽ bạn nên sử dụng || trueđể rõ ràng ý định của bạn là gì; thực sự không có lý do gì để dẫn đầu ra vào một chương trình không sử dụng nó


4
Làm cho cảm giác hoàn hảo. :) Tôi không biết tại sao nhưng đọc "không làm gì, không thành công." làm tôi cười.
Kit Sunde

9
Một lý do khác để tránh | truelà nếu lệnh tạo ra đầu ra đủ để lấp đầy bộ đệm ống, nó sẽ chặn chờ trueđể đọc nó.
cjm

3
@cjm hoặc chết do SIGPIPE
Andy

6
@Kit: Lưu ý rằng foo || truefoo | truesẽ không làm điều tương tự: foo || truesẽ hiển thị đầu ra từ foo, trong khi đó foo | truesẽ loại bỏ mọi thứ fooghi vào đầu ra tiêu chuẩn của nó (và foocó khả năng chết theo SIGPIPEhoặc chặn, như đã chỉ ra).
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời này là hoàn hảo ngoại trừ từ "có lẽ" ...!
Sam Watkins
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.