Tại sao nhiều lệnh cung cấp một tùy chọn thầm lặng của người Viking?


37

Tại sao nhiều lệnh cung cấp tùy chọn -qhoặc --quietđể chặn đầu ra khi bạn có thể dễ dàng đạt được điều tương tự bằng cách chuyển hướng đầu ra tiêu chuẩn sang tệp null?


3
Tôi coi đó chủ yếu là một lá cờ tiện lợi.
Janis

7
Không phải tất cả các lệnh sử dụng -qđể triệt tiêu tất cả đầu ra. Ví dụ, Docker có lệnh liệt kê hình ảnh; docker imageshiển thị một bảng được định dạng với một loạt thông tin, trong khi đưa docker images -qra một danh sách ID hình ảnh đơn giản (hữu ích cho đường ống đến các lệnh khác).
new123456

Câu trả lời:


71
  • Mặc dù bạn có thể dễ dàng chuyển hướng trong shell, nhưng có những bối cảnh khác không dễ dàng như khi thực hiện lệnh bằng ngôn ngữ khác mà không cần sử dụng dòng lệnh shell. Ngay cả trong một vỏ:

    find . -type f -exec grep -q foo {} \; -printf '%s\n'

    để in kích thước của tất cả các tập tin có chứa foo. Nếu bạn chuyển hướng đến /dev/null, bạn mất cả hai findgrepđầu ra. Bạn cần phải dùng đến -exec sh -c 'exec grep foo "$1" > /dev/null' sh {} \;(nghĩa là sinh ra một lớp vỏ thừa).

  • grep -q foo ngắn hơn để gõ grep foo > /dev/null
  • Chuyển hướng đến /dev/nullcó nghĩa là đầu ra vẫn được viết và sau đó bị loại bỏ, điều đó kém hiệu quả hơn so với việc không viết nó (và không phân bổ, chuẩn bị đầu ra đó được viết)
  • cho phép tối ưu hóa hơn nữa. Trong trường hợp grepví dụ, vì với -q, grepbiết đầu ra là không bắt buộc, nó sẽ thoát ngay khi tìm thấy kết quả khớp đầu tiên. Với grep > /dev/null, nó vẫn sẽ cố gắng tìm tất cả các trận đấu.
  • im lặng không nhất thiết có nghĩa là im lặng . Đối với một số lệnh, nó có nghĩa là giảm độ dài (ngược lại -v|--verbose). Ví dụ, mplayercó một --quietvà a --really-quiet. Với một số lệnh, bạn có thể sử dụng -qqqđể giảm mức độ chi tiết 3 lần.

Đáng chú ý là trong grepcả hai trang tùy chọn -q, và -s, được đề xuất nên tránh nếu tính di động là một mối quan tâm. grepThoát sớm là một tối ưu hóa quan trọng, nhưng không phải tất cả các chương trình với các tùy chọn như vậy có thể làm điều đó; curl -svẫn sẽ xử lý toàn bộ dữ liệu (nhưng điểm thứ 3 vẫn được áp dụng, do đó tiết kiệm thời gian xử lý).
Janis

6
@Janis, đó sẽ là tính di động đối với các hệ thống rất cũ. Cả hai -q-sđược chỉ định bởi POSIX. Nếu chúng ta xem xét các hệ thống cũ sau đó của tôi, sh -c '...' sh {} \;sẽ không làm việc một trong hai (với trước đó kshdựa trên shs).
Stéphane Chazelas

Trang man đề cập: grep kiểu USG cũng thiếu -q nhưng tùy chọn -s của nó hoạt động giống như GNU grep. - Tôi nghĩ rằng sự khác biệt trong hành vi có thể là một vấn đề. Tôi không thể đánh giá về sự liên quan của nó.
Janis

Tôi thường sử dụng các tùy chọn -q và --quiet khi tôi chỉ quan tâm đến mã trả về của một lệnh trong tập lệnh. Những lý do được lưu ý ở trên là những ví dụ tốt hơn tại sao.
Mark Stewart

@ StéphaneChazelas: bạn sẽ ngạc nhiên như thế nào (một phần) nhiều hệ thống vẫn còn đó cũ ... (tốt, trên thực tế, không phải là nhiều ^^ nhưng vẫn còn một số)
Olivier Dulac

3

Nó vẫn cho phép lệnh được đưa ra khi cảm thấy cần ghi chú lên màn hình nhưng thông thường nó không đưa ra được gì. với việc chuyển hướng tất cả thành null, không có cơ hội nào cho đầu ra được nhìn thấy.


Vâng, yên tĩnh có nghĩa là không có phản ứng được mong đợi; Sẽ thật bất ngờ nếu chúng ta vẫn thấy đầu ra. . )
Janis

2

Mặc dù nó có thể phụ thuộc vào lệnh, -qcũng sẽ vô hiệu hóa đầu ra stderr. Điều này cho phép các shell không dễ dàng cho phép stderr stdout xuất hiện (tôi đang nhìn bạn, csh& tcsh) để tránh tiếng ồn.

Một số chương trình cung cấp tùy chọn "im lặng" cho các tình huống có thể có đầu ra có ý nghĩa khác mà bạn không muốn bị lộn xộn với các thông báo trạng thái. Các -qhoặc tương đương sẽ im lặng tất cả các đầu ra tình trạng chương trình, cho phép một dòng dữ liệu tinh khiết từ, chẳng hạn, tarhoặc gzip.


0

Bên cạnh tất cả các phản ứng tốt và điểm trên. Đó là một thực tiễn tốt nhất để cung cấp một tùy chọn ngược lại cho mỗi cờ. Vì vậy, nếu có một -v cho tính dài dòng thì nên có -q cho tính không dài dòng, khá hoặc im lặng. (đây không phải là điểm thảo luận nhưng ...) Tương tự như vậy nên là một tùy chọn dài cho mọi cái ngắn, -q và --quite.

Như trong hầu hết mọi thứ trong kinh doanh của chúng tôi, có nhiều cách để có được một giải pháp hoặc kết quả tương tự. Có -q là một trong số đó.

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.