Khi mã trạng thái là vô dụng, có cách nào để xây dựng một đường ống dựa trên đầu ra từ thiết bị xuất chuẩn không?
Tôi muốn câu trả lời không giải quyết trường hợp sử dụng mà là câu hỏi trong phạm vi kịch bản lệnh shell. Những gì tôi đang cố gắng làm là tìm gói cụ thể nhất có sẵn trong kho bằng cách đoán tên dựa trên mã quốc gia và ngôn ngữ.
Lấy ví dụ này,
$PACKAGE1=hunspell-en-zz
$PACKAGE2=hunspell-en
Dự đoán đầu tiên là phù hợp hơn nhưng nó có thể không tồn tại. Trong trường hợp này, tôi muốn trả về hunspell-en
( $PACKAGE2
) vì tùy chọn đầu tiên hunspell-en-zz
( $PACKAGE1
) không tồn tại.
đường ống của apt-cache
Lệnh apt-cache
trả về thành công (được xác định bởi shell là mã thoát 0) bất cứ khi nào lệnh có thể chạy (từ các tài liệu của apt-cache
)
apt-cache trả về 0 khi hoạt động bình thường, lỗi thập phân 100.
Điều đó làm cho việc sử dụng lệnh trong một đường ống khó khăn hơn. Thông thường, tôi hy vọng gói tìm kiếm tương đương với 404 sẽ dẫn đến lỗi (như sẽ xảy ra với curl
hoặc wget
). Tôi muốn tìm kiếm để xem nếu một gói tồn tại, và nếu không rơi trở lại gói khác nếu nó tồn tại .
Điều này không trả về gì, vì lệnh đầu tiên trả về thành công (vì vậy rhs ||
không bao giờ chạy)
apt-cache search hunspell-en-zz || apt-cache search hunspell-en
apt-cache search
với hai đối số
Điều này không trả về gì cả, như apt-cache
các đối số của AND,
apt-cache search hunspell-en-zz hunspell-en
Từ các tài liệu của apt-cache
Các đối số riêng biệt có thể được sử dụng để chỉ định nhiều mẫu tìm kiếm được kết hợp với nhau.
Vì vậy, một trong những đối số rõ ràng không tồn tại, điều này không trả về gì cả.
Câu hỏi
Thành ngữ shell để xử lý các quy ước như những gì được tìm thấy trong apt-cache
đó mã trả về là vô dụng cho nhiệm vụ? Và thành công chỉ được xác định bởi sự hiện diện của đầu ra trên STDOUT?
Tương tự như
tìm thất bại khi không tìm thấy gì
cả hai đều xuất phát từ cùng một vấn đề. Câu trả lời được chọn có đề cập đến
find -z
điều đáng buồn là giải pháp không thể áp dụng ở đây và là trường hợp sử dụng cụ thể. Không có đề cập đến một thành ngữ hoặc xây dựng một đường ống mà không sử dụng kết thúc null (không phải là một tùy chọn trênapt-cache
)
hunspell-ar
không tồn tại và không có gói tên quốc gia. Tôi cần tìm gói chính xác nhất cho một quốc gia và ngôn ngữ nhất định.
find
cũng giống như apt-cache
ở khía cạnh này - mã trả lại vô dụng, thành công dựa trên đầu ra.
-z
rằng đáng buồn không phải là một giải pháp ở đây vì vậy vấn đề cụ thể theo trường hợp sử dụng không được áp dụng. Và không có đề cập đến một thành ngữ hoặc xây dựng một đường ống mà không sử dụng chấm dứt null (không phải là một tùy chọn trên apt-cache
)
find
được sử dụng -print0
và vì vậy grep với -z
. Vì apt-cache không cung cấp đầu ra kết thúc null, nên bạn không cần -z
.
hunspell-en
có tồn tại? Dù sao, bạn có thể sử dụngapt-cache policy
và grep cho^$PACKAGENAME:
.