Chính xác thì 2> / dev / null làm gì?

What Exactly Does 2 Dev Null Do



Cho dù bạn là người dùng Linux mới hay một lập trình viên có kinh nghiệm, rất có thể bạn gặp phải lệnh khó hiểu 2> / dev / null. Mặc dù lệnh này có vẻ phức tạp về mặt kỹ thuật, nhưng mục đích của nó rất đơn giản. Nó đề cập đến một vùng nhớ rỗng được sử dụng để ngăn chặn các đầu ra của các lệnh khác nhau. Bài viết này sẽ chia nhỏ từng phần của lệnh 2> / dev / null, giải thích mục đích của nó và xem các ví dụ về cách nó được sử dụng.

Thiết bị rỗng - ‘/ dev / null’

Tất cả các hệ thống dựa trên Linux đều có một tính năng gọi là thiết bị ảo. Các thiết bị ảo này tương tác giống như các tệp thực tế trong hệ điều hành. Hoạt động của các thiết bị ảo tương tự như các thiết bị thực; chúng được sử dụng để ghi và đọc dữ liệu. Sự khác biệt chính giữa cả hai là dữ liệu cho các thiết bị ảo được cung cấp bởi hệ điều hành.







/ dev / null là một thiết bị rỗng – một loại thiết bị ảo đặc biệt. Nó hiện diện trong mọi hệ thống Linux và mục đích của thiết bị này là loại bỏ bất cứ thứ gì được gửi đến nó và đọc End of File (EOF). Hầu hết các thiết bị ảo được sử dụng để đọc dữ liệu; tuy nhiên, / dev / null là duy nhất vì nó được sử dụng để ngăn chặn bất kỳ dữ liệu nào được ghi vào nó. Nói một cách dễ hiểu, nó hoạt động như một lỗ đen đối với bất kỳ dữ liệu nào được ghi vào nó trong hệ điều hành Linux.



Bây giờ, chúng ta hãy xem xét các phần còn lại của lệnh 2> / dev / null



Bộ mô tả tệp - ‘2’

Mỗi lần thực thi lệnh trong Linux đều tạo ra ba tệp liên kết: đầu vào tiêu chuẩn, đầu ra tiêu chuẩn và tệp lỗi tiêu chuẩn. Hệ điều hành Linux đề cập đến mỗi tệp này bằng một số nguyên không âm duy nhất.





  • '0' cho đầu vào chuẩn
  • '1' cho đầu ra tiêu chuẩn
  • '2' cho lỗi tiêu chuẩn

Các thuật ngữ kỹ thuật cho đầu vào tiêu chuẩn, đầu ra tiêu chuẩn và các luồng lỗi tiêu chuẩn lần lượt là stdin, stdout và stderr.

Chúng ta biết rằng số ‘2’ trong lệnh ‘2> / dev / null’ đề cập đến luồng lỗi chuẩn (stderr).



Toán tử chuyển hướng tệp - ‘>’

Ký hiệu ‘>’ được gọi là toán tử chuyển hướng tệp. Mục đích của nó là hướng những gì ở bên trái sang các lệnh ở bên phải. Nói cách đơn giản hơn, bất kỳ chuỗi dữ liệu nào ở bên trái sẽ được chuyển hướng đến phía bên phải của toán tử.

Cho đến nay, chúng ta đã hiểu mục đích đằng sau mỗi thành phần của lệnh 2> / dev / null. Nó gửi luồng lỗi tới / dev / null, dòng này sẽ loại bỏ nó. Nói cách khác, lệnh này được sử dụng để loại bỏ và loại bỏ các đầu ra lỗi. Tuy nhiên, nếu bạn là một chuyên gia Linux có kinh nghiệm, bạn có thể xem nội dung của tệp / dev / null bằng cách chạy lệnh sau trong terminal:

$ls -NS /nhà phát triển/vô giá trị

Lệnh này thường được sử dụng trong các tình huống mà chúng tôi cần lọc đầu ra dựa trên lỗi hoặc khi chúng tôi muốn loại bỏ bất kỳ đầu ra nào liên quan đến mô tả sai. Trong tương lai, chúng ta sẽ xem xét các ví dụ về cách sử dụng nó trên hệ thống Ubuntu.

Sử dụng 2> / dev / null

Vì chúng ta biết rằng lệnh 2> / dev / null được sử dụng để loại bỏ lỗi, nó sẽ luôn được sử dụng cùng với các lệnh khác. Chúng ta sẽ thấy một cách tiếp cận tương tự trong các ví dụ sau. Bạn có thể mở thiết bị đầu cuối bằng cách truy cập nó thông qua menu ứng dụng hoặc sử dụng phím tắt Ctrl + Alt + T.

Trong ví dụ đầu tiên, chúng tôi sẽ tiến hành tìm kiếm trong thư mục / sys / cho một chuỗi ngẫu nhiên (helloworld trong trường hợp này). Lệnh tìm kiếm là grep và đối số của nó sẽ là chuỗi tìm kiếm. Nhập lệnh sau để tìm kiếm chuỗi của bạn.

$nắm chặt -NSChào thế giới/sys/

Lệnh tìm kiếm này bị ràng buộc để hiển thị nhiều lỗi vì nó đang được sử dụng mà không có quyền truy cập root. Chúng tôi sẽ gửi luồng lỗi của nó tới / dev / null bằng cách sử dụng lệnh 2> / dev / null để loại bỏ những lỗi này.

$nắm chặt -NSChào thế giới/sys/ 2> /nhà phát triển/vô giá trị

Chúng ta có thể thấy rằng đầu ra của lệnh gọn gàng và đơn giản hơn nhiều so với lệnh cuối cùng. Lý do là các lỗi đang được loại bỏ bằng cách sử dụng 2> / dev / null và vì lệnh grep không thể tìm thấy bất kỳ tệp nào khớp với chuỗi ‘helloworld’ của chúng tôi nên nó không hiển thị bất kỳ đầu ra nào.

Để hiểu rõ hơn về cách sử dụng / dev / null, chúng ta sẽ xem xét ví dụ sau về ping bất kỳ trang web nào (trong trường hợp của chúng ta là google.com). Bạn có thể ping google.com bằng cách thực hiện lệnh sau:

$pingGoogle com

Nếu chúng ta muốn loại trừ tất cả các ping không thành công, chúng ta có thể sử dụng lệnh 2> / dev / null:

$pingGoogle com2> /nhà phát triển/vô giá trị

Trong trường hợp này, luồng lỗi chuẩn (hiển thị các ping không thành công tới google.com) được gửi đến thiết bị ảo / dev / null để loại bỏ chúng.

Tuy nhiên, nếu chúng ta chỉ muốn xem các ping bị lỗi, chúng ta có thể thực hiện lệnh sau:

$pingGoogle com1> /nhà phát triển/vô giá trị

Ở đây, chúng tôi gửi luồng đầu ra tiêu chuẩn (stdout) đến thiết bị / dev / null loại bỏ nó. Do đó, chúng tôi chỉ còn lại các ping không đến được máy chủ google.com. Tuy nhiên, trong trường hợp của chúng tôi, không có ping nào bị lỗi. Chúng tôi cũng có thể hướng stdout và stderr đến các vị trí khác nhau. Điều này rất hữu ích nếu chúng ta muốn loại bỏ đầu ra và lưu trữ lỗi trong nhật ký hoặc ngược lại. Bạn có thể chạy lệnh sau để lưu trữ các ping không thành công trong nhật ký lỗi trong khi hủy đầu ra chuẩn của lệnh ping:

$pingGoogle com1> /nhà phát triển/vô giá trị2>lỗi. nhật ký

Đôi khi, bạn có thể muốn chặn tất cả đầu ra của một lệnh (bao gồm cả đầu ra tiêu chuẩn và lỗi tiêu chuẩn). Chúng ta có thể đạt được điều này bằng cách sử dụng thiết bị / dev / null theo một cách hơi khác. Bạn có thể nhập lệnh sau để chặn tất cả đầu ra:

$pingGoogle com> /nhà phát triển/vô giá trị2> &1

Lưu ý rằng thứ tự của các lệnh ở đây là rất quan trọng. Sau khi thực hiện lệnh ping, ‘> / dev / null’ ra lệnh cho hệ thống chặn đầu ra và ‘2> & 1’ hướng luồng lỗi tiêu chuẩn đến đầu ra tiêu chuẩn. Bằng cách này, tất cả đầu ra của lệnh sẽ bị loại bỏ.

Phần kết luận

Chúng tôi đã phân tích lệnh 2> / dev / null và các ví dụ đơn giản trong bài viết này và hy vọng bây giờ bạn đã hiểu từng bit của nó. Tuy nhiên, đây chỉ là phần nổi của tảng băng chìm; các thiết bị null được sử dụng theo nhiều cách trong lập trình bash. Một số cách sử dụng nâng cao hơn bao gồm kiểm tra sự tồn tại của tệp, tự động cài đặt gói và tránh các tập lệnh chạy vào các trường hợp ngoại lệ không mong muốn.