Về mặt kỹ thuật, /dev/null là một tệp thiết bị ảo (virtual device file). Đối với các chương trình, chúng được xử lý như các tệp thự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 cung cấp dữ liệu. Nhưng thay vì đọc từ đĩa, hệ điều hành tạo ra dữ liệu này động. Ví dụ của loại tệp này là /dev/zero.
Trong trường hợp này, bạn sẽ ghi vào một tệp thiết bị. Bất cứ gì bạn ghi vào /dev/null sẽ bị loại bỏ, lãng quên, ném vào hư vô. Để hiểu tại sao điều này hữu ích, bạn trước tiên cần hiểu cơ bản về đầu ra chuẩn (standard output - stdout) và lỗi chuẩn (standard error - stderr) trong Linux hoặc hệ điều hành loại *nix.
stdout và stderr
Một tiện ích dòng lệnh có thể tạo ra hai loại đầu ra. Đầu ra chuẩn được gửi đến stdout. Lỗi được gửi đến stderr.
Mặc định, stdout và stderr được liên kết với cửa sổ terminal (hoặc console) của bạn. Điều này có nghĩa là bất cứ thứ gì gửi đến stdout và stderr thường hiển thị trên màn hình. Nhưng thông qua chuyển hướng shell (shell redirections), 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. Cách này, thay vì hiển thị đầu ra trên màn hình, nó sẽ được lưu vào tệp để đọc sau – hoặc bạn có thể chuyển hướng stdout đến thiết bị vật lý, ví dụ màn hình LED hoặc LCD số.

Một bài viết đầy đủ về pipe và chuyển hướng có sẵn nếu bạn muốn tìm hiểu thêm.
- Với
2>bạn chuyển hướng thông báo lỗi chuẩn. Ví dụ:2>/dev/nullhoặc2>/home/user/error.log. - Với
1>bạn chuyển hướng đầu ra chuẩn. - Với
&>bạn chuyển hướng cả lỗi chuẩn và đầu ra chuẩn.
Sử Dụng /dev/null Để Loại Bỏ Đầu Ra Không Cần Thiết
Vì có hai loại đầu ra, trường hợp sử dụng đầu tiên là lọc loại bỏ một loại hoặc loại kia. Dễ hiểu qua ví dụ thực tế. Giả sử bạn đang tìm một chuỗi trong /sys để tìm các tệp tham chiếu đến cài đặt nguồn.
grep -r power /sys/
Sẽ có nhiều tệp mà người dùng thông thường (non-root) không thể đọc. Điều này dẫn đến nhiều lỗi "Permission denied" (Truy cập bị từ chối).

Những lỗi này làm rối đầu ra và khó hơn để phát hiện kết quả bạn cần. Vì lỗi "Permission denied" thuộc stderr, bạn có thể chuyển hướng chúng đến /dev/null.
grep -r power /sys/ 2>/dev/null

Như bạn thấy, dễ đọc hơn nhiều.
Trong các trường hợp khác, có thể hữu ích khi làm ngược lại: lọc bỏ đầu ra chuẩn để chỉ thấy lỗi.
ping google.com 1>/dev/null

Ảnh chụp màn hình trên cho thấy, không chuyển hướng thì ping hiển thị đầu ra bình thường khi đến được máy đích. Lệnh thứ hai, không có gì hiển thị khi mạng trực tuyến, nhưng ngay khi ngắt kết nối, chỉ 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 điệp stdout không 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 hữu ích khi loại bỏ tất cả đầu ra. Có hai cách làm.
grep -r power /sys/ >/dev/null 2>&1
Chuỗi >/dev/null nghĩa là "gửi stdout đến /dev/null", và phần thứ hai 2>&1 nghĩa là gửi stderr đến stdout. Ở đây bạn phải tham chiếu stdout là &1 thay vì chỉ 1. Viết 2>1 sẽ chỉ chuyển hướng stdout đến tệp tên là "1".
Điều quan trọng là thứ tự quan trọng. Nếu đảo ngược tham số chuyển hướng như sau:
grep -r power /sys/ 2>&1 >/dev/null
sẽ không hoạt động như mong đợi. Đó là vì ngay khi 2>&1 được diễn giải, stderr được gửi đến stdout và hiển thị trên màn hình. Tiếp theo, stdout bị chặn khi 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ì chặn tất cả đầu ra. Nếu không nhớ thứ tự đúng, có một chuyển hướng đơn giản hơn, dễ gõ hơn:
grep -r power /sys/ &>/dev/null
Trong trường hợp này, &>/dev/null tương đương với "chuyển hướng cả stdout và stderr đến vị trí này".
Các Ví Dụ Khác Về Việc Chuyển Hướng Đến /dev/null
Giả sử bạn muốn xem ổ cứng đọc dữ liệu tuần tự nhanh như thế nào. Kiểm tra không cực kỳ chính xác nhưng đủ chính xác. Bạn có thể dùng dd cho việc này, nhưng dd hoặc xuất ra stdout hoặc được chỉ dẫn ghi vào tệp. Với of=/dev/null bạn có thể bảo dd ghi vào tệp ảo này. Bạn thậm chí không cần dùng chuyển hướng shell ở đây. if= chỉ định vị trí tệp đầu vào để đọc; of= chỉ định tên tệp đầu ra, nơi ghi.
dd if=debian-disk.qcow2 of=/dev/null status=progress bs=1M iflag=direct

Trong một số tình huống, 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 một cách không cần thiết. Đơn giản là không ghi vào tệp thông thường, 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 các ví dụ trong bài viết này truyền cảm hứng cho bạn tìm ra cách sáng tạo riêng để sử dụng /dev/null.
Bạn biết trường hợp sử dụng thú vị cho tệp thiết bị đặc biệt này? Hãy để lại bình luận bên dưới và chia sẻ kiến thức!