Điểm nào trong việc chuyển hướng đầu ra của grep sang / dev / null?


24

Hãy xem xét dòng này:

${libdir}/bin/licenseTool check "${SERIAL}" "${VERSION}" "${PRODUCT}" ${libdir} | grep '^200' >/dev/null

Điểm tìm kiếm mẫu trong đầu ra là gì nếu kết quả của bị vứt đi?

Và, nếu một dòng như thế xuất hiện như là điều cuối cùng trong tập lệnh bash, thì giá trị thoát của nó được trả về cho người gọi của tập lệnh hay bị bỏ qua? (Tôi đang suy đoán xem liệu chúng ta có thể cho rằng điều này chỉ được thực hiện cho các tác dụng phụ hay trả lại một cái gì đó cho người gọi bằng cách nào đó.)

Câu trả lời:


29

Sự nghi ngờ của bạn là chính xác; trạng thái thoát lệnh cuối cùng của tập lệnh sẽ được chuyển đến môi trường gọi. Vì vậy, câu trả lời là tập lệnh này sẽ trả về trạng thái thoát 0 nếu grepkhớp đôi khi trong dữ liệu, tồn tại trạng thái 1 nếu không có kết quả khớp và thoát trạng thái 2 nếu xảy ra lỗi.


27

Điểm grepđầu ra ping bị vứt đi là người viết chỉ muốn trạng thái trả về grep. Anh ấy / Cô ấy chỉ muốn biết liệu một mô hình phù hợp hay không. Trong trường hợp của bạn, grepkiểm tra lần cuối nếu đầu ra của lệnh trước đó có chứa bất kỳ dòng nào bắt đầu bằng không 200.

Trong hệ thống POSIX hiện đại, bạn có thể làm tất cả với grep -q mà không cần chuyển hướng đến /dev/null:

... | grep -q '^200'

Một lưu ý rằng việc sử dụng grep -qcó tác dụng phụ nhỏ, cảm ơn Stéphane Chazelas đã chỉ ra trong nhận xét của mình. grep -qthoát ngay khi tìm thấy trận đấu đầu tiên, nếu licenseToolvẫn viết một cái gì đó sau khi grepthoát, nó sẽ nhận được SIGPIPE.


2
grep -qsử dụng ít CPU hơn
Skaperen

5
Khi những điều này đi, grep -qđã được thêm vào tương đối gần đây; > /dev/nullthay vào đó, rất nhiều kịch bản vẫn sử dụng vì đó là tất cả những gì bạn có trong Kỷ băng hà (đó là năm 1995).
zwol

3
Là câu đầu tiên của bạn thiếu một động từ?
AL

Một sự không tương đương khác giữa "grep -q" và "grep> / dev / null", từ trang GNU: "Tuy nhiên, nếu -q hoặc --quiet hoặc --silent được sử dụng và một dòng được chọn, trạng thái thoát là 0 ngay cả khi xảy ra lỗi. "
Đánh dấu

nếu tài liệu đúng "trạng thái thoát là 0 ngay cả khi xảy ra lỗi" ... Tôi nghĩ -qtùy chọn có vẻ không phù hợp ... bởi vì bạn muốn nó biết về lỗi bằng cách kiểm tra trạng thái thoát.
Trevor Boyd Smith
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.