Tôi nên sử dụng dấu ngoặc đơn hay góc kép để chuyển hướng đến / dev / null?


18

Hầu hết các câu trả lời ở đây [ 1 ] [ 2 ] [ 3 ] sử dụng dấu ngoặc đơn để chuyển hướng đến / dev / null, như thế này:

command > /dev/null

Nhưng việc thêm vào / dev / null cũng hoạt động:

command >> /dev/null

Ngoại trừ nhân vật phụ, có lý do gì để không làm điều này? Là một trong những "đẹp hơn" cho việc triển khai cơ bản của / dev / null?

Chỉnh sửa:
Các mở (2) manpage nói lseek được gọi là trước mỗi ghi vào một tập tin trong chế độ append:

O_APPEND
Tệp được mở trong chế độ chắp thêm. Trước mỗi lần ghi (2), phần bù tập tin được định vị ở cuối tập tin, như thể với lseek (2). Việc sửa đổi bù tập tin và thao tác ghi được thực hiện dưới dạng một bước nguyên tử.

mà làm cho tôi nghĩ rằng có thể có một hình phạt hiệu suất nhỏ để sử dụng >>. Nhưng mặt khác, cắt / dev / null có vẻ như là một hoạt động không xác định theo tài liệu đó:

O_TRUNC
Nếu tệp đã tồn tại và là tệp thông thường và chế độ truy cập cho phép ghi (tức là O_RDWR hoặc O_WRONLY), nó sẽ bị cắt ngắn đến độ dài 0. Nếu tệp là tệp FIFO hoặc thiết bị đầu cuối, cờ O_TRUNC sẽ bị bỏ qua. Mặt khác, ảnh hưởng của O_TRUNC là không xác định.

và thông số POSIX cho biết >sẽ cắt bớt một tệp hiện có , nhưng O_TRUNC được xác định theo thực thi cho các tệp thiết bịkhông có thông tin nào về cách / dev / null sẽ phản hồi khi bị cắt ngắn .

Vì vậy, là cắt ngắn / dev / null thực sự không xác định? Và các cuộc gọi lseek có ảnh hưởng gì đến hiệu suất ghi không?

Câu trả lời:


27

Theo định nghĩa sẽ nhấn /dev/nullchìm bất cứ điều gì được viết cho nó , vì vậy không quan trọng bạn có viết ở chế độ chắp thêm hay không, tất cả đều bị loại bỏ. Vì nó không lưu trữ dữ liệu, nên thực sự không có gì để thêm vào.

Vì vậy, cuối cùng, nó chỉ ngắn hơn để viết > /dev/nullvới một >dấu hiệu.

Đối với phần bổ sung được chỉnh sửa:

Trang web mở (2) cho biết lseek được gọi trước mỗi lần ghi vào một tệp ở chế độ chắp thêm.

Nếu bạn đọc kỹ, bạn sẽ thấy nó nói (nhấn mạnh của tôi):

phần bù tập tin được định vị ở cuối tập tin, như thể với lseek (2)

Có nghĩa là, nó thực sự không cần phải gọi cuộc gọi lseekhệ thống và hiệu ứng cũng không hoàn toàn giống nhau: gọi lseek(fd, SEEK_END, 0); write(fd, buf, size);O_APPENDkhông giống như viết trong chế độ chắp thêm, vì với các cuộc gọi riêng biệt, một quá trình khác có thể ghi vào tập tin ở giữa các cuộc gọi hệ thống, xử lý dữ liệu được nối thêm. Trong chế độ chắp thêm, điều này không xảy ra (ngoại trừ NFS, không hỗ trợ chế độ chắp thêm thực sự ).

Văn bản trong tiêu chuẩn không đề cập đến lseektại thời điểm đó, chỉ có văn bản đó sẽ đi đến cuối tập tin.

Vì vậy, là cắt ngắn / dev / null thực sự không xác định?

Đánh giá theo thánh thư mà bạn đề cập, rõ ràng đó là định nghĩa triển khai. Có nghĩa là bất kỳ triển khai lành mạnh nào cũng sẽ làm tương tự như với các đường ống và TTY, cụ thể là, không có gì. Một triển khai điên rồ có thể làm một cái gì đó khác, và có lẽ cắt ngắn có thể có nghĩa là một cái gì đó hợp lý trong trường hợp của một số tập tin thiết bị khác.

Và các cuộc gọi lseek có ảnh hưởng gì đến hiệu suất ghi không?

Kiểm tra nó Đó là cách duy nhất để biết chắc chắn về một hệ thống nhất định. Hoặc đọc nguồn để xem chế độ chắp thêm thay đổi hành vi, nếu ở bất cứ đâu.


-3

Nếu đó là hiệu quả bạn muốn, command >&-thay vào đó hãy sử dụng . Điều này sẽ đóng bộ mô tả tập tin thay vì chuyển hướng nó, vì vậy không có thời gian nào bị lãng phí khi viết mọi thứ cho nó.


3
Không đóng luồng nhỏ hơn 3. Điều này bí danh các mô tả std * với các mô tả tệp ngẫu nhiên; có khả năng với kết quả thảm khốc.
Joshua

7
Nếu bạn chỉ đóng bộ mô tả tệp, chương trình sẽ gặp lỗi trên mỗi cuộc gọi ghi, có thể dẫn đến các thông báo lỗi gây phiền nhiễu và có thể chương trình kết thúc trước khi hoàn thành nhiệm vụ.
ilkkachu
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.