Về mặt kỹ thuật, “/ dev / null” là một tệp thiết bị ảo. Đối với các chương trình có liên quan, chúng được xử lý giống như các tệp thực. Các tiện ích có thể yêu cầu dữ liệu từ loại nguồn này và hệ điều hành sẽ cung cấp dữ liệu cho chúng. Tuy nhiên, thay vì đọc từ đĩa, hệ điều hành tạo ra dữ liệu này một cách động. Ví dụ về tệp như vậy là “/ dev / zero.”
Tuy nhiên, trong trường hợp này, bạn sẽ ghi vào một tệp thiết bị. Bất cứ thứ gì bạn viết cho “/ dev / null” đều bị loại bỏ, bị lãng quên, bị ném vào khoảng trống. Để hiểu tại sao điều này lại hữu ích, trước tiên bạn phải có hiểu biết cơ bản về đầu ra tiêu chuẩn và lỗi tiêu chuẩn trong hệ điều hành Linux hoặc * nix.
stdout và stder
Một tiện ích dòng lệnh có thể tạo ra hai loại đầu ra. Đầu ra tiêu chuẩn được gửi đến stdout. Lỗi được gửi đến stderr.
Theo mặc định, stdout và stderr được liên kết với cửa sổ đầu cuối (hoặc bảng điều khiển) của bạn. Điều này có nghĩa là mọi thứ được gửi đến stdout và stderr thường được hiển thị trên màn hình của bạn. Nhưng thông qua chuyển hướng shell, bạn có thể thay đổi hành vi này. Ví dụ:bạn có thể chuyển hướng stdout đến một tệp. Bằng cách này, thay vì hiển thị đầu ra trên màn hình, nó sẽ được lưu vào một tệp để bạn đọc sau - hoặc bạn có thể chuyển hướng stdout đến một thiết bị vật lý, chẳng hạn như màn hình LED hoặc LCD kỹ thuật số.
Có sẵn một bài viết đầy đủ về đường ống và chuyển hướng nếu bạn muốn tìm hiểu thêm.
- Với
2>
bạn chuyển hướng các thông báo lỗi tiêu chuẩn. Ví dụ:2>/dev/null
hoặc2>/home/user/error.log
. - Với
1>
bạn chuyển hướng đầu ra tiêu chuẩn. - Với
&>
bạn chuyển hướng cả lỗi tiêu chuẩn và đầu ra tiêu chuẩn.
Sử dụng / dev / null để loại bỏ đầu ra bạn không cần
Vì có hai loại đầu ra, đầu ra tiêu chuẩn và lỗi tiêu chuẩn, trường hợp sử dụng đầu tiên là lọc ra loại này hoặc loại kia. Sẽ dễ hiểu hơn thông qua một ví dụ thực tế. Giả sử bạn đang tìm kiếm một chuỗi trong “/ sys” để tìm các tệp liên quan đến cài đặt nguồn.
grep -r power /sys/
Sẽ có rất nhiều tệp mà người dùng thông thường, không phải root không thể đọc được. Điều này sẽ dẫn đến nhiều lỗi "Quyền bị từ chối".
Những điều này làm lộn xộn đầu ra và khiến việc tìm ra kết quả mà bạn đang tìm kiếm trở nên khó khăn hơn. Vì lỗi “Quyền bị từ chối” là một phần của stderr, bạn có thể chuyển hướng chúng đến “/ dev / null.”
grep -r power /sys/ 2>/dev/null
Như bạn có thể thấy, điều này dễ đọc hơn nhiều.
Trong các trường hợp khác, có thể hữu ích nếu làm ngược lại:lọc ra đầu ra tiêu chuẩn để bạn chỉ có thể thấy lỗi.
ping google.com 1>/dev/null
Ảnh chụp màn hình ở trên cho thấy rằng, không chuyển hướng, ping hiển thị đầu ra bình thường khi nó có thể đến được máy đích. Trong lệnh thứ hai, không có gì được hiển thị khi mạng đang trực tuyến, nhưng ngay sau khi nó bị ngắt kết nối, chỉ có thông báo lỗi được hiển thị.
Bạn có thể chuyển hướng cả stdout và stderr đến hai vị trí khác nhau.
ping google.com 1>/dev/null 2>error.log
Trong trường hợp này, thông báo stdout sẽ hoàn toàn không được hiển thị và thông báo lỗi sẽ được lưu vào tệp “error.log”.
Chuyển hướng tất cả đầu ra đến / dev / null
Đôi khi, việc loại bỏ tất cả đầu ra sẽ rất hữu ích. Có hai cách để thực hiện việc này.
grep -r power /sys/ >/dev/null 2>&1
Chuỗi >/dev/null
có nghĩa là “gửi stdout tới / dev / null,” và phần thứ hai, 2>&1
, nghĩa là gửi stderr tới stdout. Trong trường hợp này, bạn phải gọi stdout là “&1” thay vì chỉ đơn giản là “1.” Viết “2> 1” sẽ chỉ chuyển hướng stdout đến một tệp có tên “1.”
Điều quan trọng cần lưu ý ở đây là thứ tự rất quan trọng. Nếu bạn đảo ngược các tham số chuyển hướng như sau:
grep -r power /sys/ 2>&1 >/dev/null
nó sẽ không hoạt động như dự định. Đó là bởi vì ngay khi 2>&1
được thông dịch, stderr được gửi đến stdout và hiển thị trên màn hình. Tiếp theo, stdout được nén khi được gửi đến “/ dev / null.” Kết quả cuối cùng là bạn sẽ thấy lỗi trên màn hình thay vì tắt tất cả đầu ra. Nếu bạn không thể nhớ đúng thứ tự, có một chuyển hướng đơn giản hơn dễ nhập hơn nhiều:
grep -r power /sys/ &>/dev/null
Trong trường hợp này, &>/dev/null
tương đương với việc nói “chuyển hướng cả stdout và stderr đến vị trí này.”
Các ví dụ khác có thể hữu ích khi chuyển hướng đến / dev / null
Giả sử bạn muốn xem đĩa của mình có thể đọc dữ liệu tuần tự nhanh như thế nào. Thử nghiệm không phải là cực kỳ chính xác nhưng đủ chính xác. Bạn có thể sử dụng dd
cho điều này, nhưng dd hoặc xuất ra stdout hoặc có thể được hướng dẫn để ghi vào một tệp. Với of=/dev/null
bạn có thể yêu cầu dd ghi vào tệp ảo này. Bạn thậm chí không phải sử dụng chuyển hướng vỏ ở đây. if=
chỉ định vị trí của tệp đầu vào sẽ được đọc; of=
chỉ định tên của tệp đầu ra, nơi viết.
dd if=debian-disk.qcow2 of=/dev/null status=progress bs=1M iflag=direct
Trong một số trường hợp, bạn có thể muốn xem tốc độ tải xuống từ máy chủ. Nhưng bạn không muốn ghi vào đĩa của mình một cách không cần thiết. Đơn giản thôi, đừng ghi vào tệp thông thường, hãy ghi vào “/ dev / null.”
wget -O /dev/null https://ftp.halifax.rwth-aachen.de/ubuntu-releases/18.04/ubuntu-18.04.2-desktop-amd64.iso
Kết luận
Hy vọng rằng các ví dụ trong bài viết này có thể truyền cảm hứng cho bạn để tìm ra những cách sáng tạo của riêng bạn để sử dụng “/ dev / null.”
Biết một trường hợp sử dụng thú vị cho tệp thiết bị đặc biệt này? Để lại bình luận bên dưới và chia sẻ kiến thức!