Ví dụ về chuyển hướng đầu vào đầu ra trong Linux/Unix

⚡ Tóm tắt thông minh

Trong Linux và Unix, chuyển hướng (redirection) thay đổi nơi một lệnh đọc đầu vào hoặc gửi đầu ra, hoán đổi (swap).ping Bàn phím và màn hình dành cho các tệp hoặc thiết bị sử dụng các toán tử như dấu lớn hơn, dấu nhỏ hơn và toán tử nối thêm.

  • 🔀 Chuyển hướng: Chuyển hướng (Redirection) thay đổi đầu vào hoặc đầu ra tiêu chuẩn của một lệnh từ bàn phím và màn hình sang một tệp hoặc thiết bị.
  • ➡️ Đầu ra: Toán tử > ghi kết quả vào một tệp, trong khi toán tử >> thêm nội dung vào một tệp hiện có mà không xóa nội dung đó.
  • ⬅️ Đầu vào: Toán tử < dùng một tệp tin làm đầu vào chuẩn cho lệnh thay vì từ bàn phím.
  • 🔢 Mô tả tập tin: Mỗi tập tin đang mở đều được gán một số: 0 cho stdin, 1 cho stdout và 2 cho stderr.
  • ⚠️ Lỗi chuyển hướng: Sử dụng 2> sẽ gửi các thông báo lỗi vào một tệp riêng biệt để chúng không làm rối loạn đầu ra thông thường.
  • 🔗 Các luồng kết hợp: Cú pháp 2>&1 định tuyến lỗi chuẩn đến cùng một đích với đầu ra chuẩn.
  • 🤖 Hỗ trợ từ AI: Các trợ lý AI và GitHub Copilot có thể xây dựng và giải thích các lệnh chuyển hướng và tập lệnh shell.

Chuyển hướng đầu vào/đầu ra trong Linux và Unix kèm ví dụ

Chuyển hướng là một trong những tính năng hữu ích nhất của Linux và shell Unix, vì nó cho phép bạn quyết định nơi một lệnh đọc đầu vào và gửi đầu ra. Trang này giải thích về chuyển hướng đầu ra, đầu vào và lỗi với các ví dụ minh họa.

Chuyển hướng là gì?

Chuyển hướng là một tính năng trong Linux cho phép bạn thay đổi thiết bị đầu vào và đầu ra chuẩn khi thực thi một lệnh. Quy trình làm việc cơ bản của bất kỳ hệ điều hành nào đều dựa trên tính năng này. Lệnh Linux Đó là việc nó nhận đầu vào và cho ra đầu ra.

  • Thiết bị đầu vào tiêu chuẩn (stdin) là bàn phím.
  • Thiết bị đầu ra tiêu chuẩn (stdout) là màn hình.

Với tính năng chuyển hướng, đầu vào và đầu ra tiêu chuẩn ở trên có thể được thay đổi.

Chuyển hướng đầu ra

Hình ảnh bên dưới đánh dấu sự bắt đầu của các ví dụ về chuyển hướng đầu ra.

Hình ảnh tiêu đề phần chuyển hướng đầu ra

Ký hiệu '>' được sử dụng để chuyển hướng đầu ra (STDOUT).

Ví dụ:

ls -al > listings

Ở đây, kết quả của lệnh `ls -al` được chuyển hướng đến tệp "listings" thay vì hiển thị trên màn hình của bạn. Ảnh chụp màn hình bên dưới cho thấy kết quả.

Cửa sổ terminal hiển thị danh sách lệnh `ls -al` được chuyển hướng vào tệp danh sách.

Lưu ý: Hãy sử dụng tên tệp chính xác khi chuyển hướng đầu ra lệnh đến một tệp. Nếu tệp có cùng tên đã tồn tại, lệnh được chuyển hướng sẽ xóa nội dung của tệp đó và ghi đè lên.

Nếu bạn không muốn ghi đè lên một tập tin nhưng muốn thêm nội dung vào tập tin hiện có, hãy sử dụng toán tử '>>'. Ảnh chụp màn hình bên dưới hiển thị nội dung được thêm vào bằng '>>'.

Cửa sổ dòng lệnh hiển thị kết quả đầu ra của lệnh được thêm vào một tệp hiện có bằng toán tử lớn hơn kép.

Bạn có thể chuyển hướng đầu ra chuẩn không chỉ đến các tệp mà còn đến các thiết bị.

$ cat music.mp3 > /dev/audio

Lệnh cat đọc tập tin music.mp3 và gửi tín hiệu đầu ra đến /dev/audio, là thiết bị âm thanh. Nếu cấu hình âm thanh trên máy tính của bạn chính xác, lệnh này sẽ phát tệp nhạc.mp3.

Chuyển hướng đầu vào

Hình ảnh bên dưới minh họa việc chuyển hướng đầu vào.

Hình ảnh tiêu đề phần chuyển hướng đầu vào

Ký hiệu '<' được sử dụng để chuyển hướng đầu vào (STDIN).

Ví dụ: Chương trình thư điện tử trong Linux có thể giúp bạn gửi email từ thiết bị đầu cuối.

Bạn có thể nhập nội dung email bằng bàn phím, thiết bị nhập liệu tiêu chuẩn. Nhưng nếu bạn muốn đính kèm tệp vào email, bạn có thể sử dụng toán tử chuyển hướng nhập liệu theo định dạng sau.

mail -s "Subject" to-address < Filename

Ảnh chụp màn hình bên dưới cho thấy lệnh mail đang đọc một tệp làm đầu vào.

Lệnh mail sử dụng chuyển hướng đầu vào để đính kèm tệp vào email

Thao tác này sẽ đính kèm tệp vào email và gửi đến người nhận.

Các ví dụ trên khá đơn giản. Bây giờ hãy xem xét một số kỹ thuật chuyển hướng nâng cao sử dụng bộ mô tả tệp.

Tập tin Descriptors (FD)

Trong Linux và Unix, mọi thứ đều là tập tin. Các tập tin thông thường, thư mục, và thậm chí cả thiết bị đều là tập tin. Mỗi tập tin đều có một số liên kết được gọi là bộ mô tả tập tin (FD).

Sơ đồ bên dưới minh họa các luồng chuẩn và các bộ mô tả tệp của chúng.

Sơ đồ các luồng đầu vào, đầu ra và lỗi tiêu chuẩn cùng các mô tả tệp của chúng.

Màn hình của bạn cũng có một bộ mô tả tệp. Khi một chương trình được thực thi, đầu ra được gửi đến bộ mô tả tệp của màn hình, và bạn thấy đầu ra của chương trình trên màn hình của mình. Nếu đầu ra được gửi đến bộ mô tả tệp của máy in, đầu ra của chương trình sẽ được in ra.

Chuyển hướng lỗi

Mỗi khi bạn thực thi một chương trình hoặc lệnh tại thiết bị đầu cuối, ba tệp luôn được mở, đó là tệp đầu vào chuẩn, tệp đầu ra chuẩn và tệp lỗi chuẩn.

Các tập tin này luôn hiện diện mỗi khi một chương trình chạy. Như đã giải thích trước đó, mỗi tập tin này đều được liên kết với một bộ mô tả tập tin.

Tập tin Tập tin Descriptor
Đầu vào tiêu chuẩn STDIN 0
Đầu ra tiêu chuẩn STDOUT 1
Lỗi tiêu chuẩn STDERR 2

Theo mặc định, luồng lỗi được hiển thị trên màn hình. Chuyển hướng lỗi sẽ chuyển các lỗi đến một tệp khác thay vì hiển thị trên màn hình.

Tại sao chuyển hướng lỗi?

Chuyển hướng lỗi là một trong những tính năng rất phổ biến của Unix và Linux.

Những người dùng Unix thường xuyên sẽ biết rằng nhiều lệnh thường gây ra rất nhiều lỗi. Ví dụ, khi tìm kiếm tệp, người ta thường nhận được cho phép Các lỗi bị từ chối thường không giúp ích gì cho người đang tìm kiếm một tập tin cụ thể. Khi thực thi các tập lệnh shell, bạn thường không muốn các thông báo lỗi làm rối loạn đầu ra chương trình thông thường.

Giải pháp là chuyển hướng các thông báo lỗi vào một tệp.

Ví dụ 1

$ myprogram 2>errorsfile

Ảnh chụp màn hình bên dưới hiển thị lệnh này trong cửa sổ dòng lệnh.

Cửa sổ dòng lệnh đang chạy chương trình của tôi với lỗi chuẩn được chuyển hướng đến tệp errorsfile.

Ở trên, chúng ta đang thực thi một chương trình có tên là myprogram. Bộ mô tả tệp cho lỗi chuẩn là 2. Sử dụng “2>”, chúng ta chuyển hướng đầu ra lỗi đến một tệp có tên là “errorsfile”. Do đó, đầu ra của chương trình không bị quá tải bởi các lỗi.

Ví dụ 2

Đây là một ví dụ khác sử dụng câu lệnh find.

find . -name 'my*' 2>error.log

Sử dụng lệnh find, chúng ta tìm kiếm trong thư mục hiện tại “.” một tệp có tên bắt đầu bằng “my”, và chuyển mọi lỗi đến error.log.

Ví dụ 3: Chúng ta hãy xem xét một ví dụ phức tạp hơn.

Quản trị viên máy chủ thường liệt kê các thư mục và lưu cả lỗi lẫn đầu ra chuẩn vào một tệp, để có thể xử lý sau này. Đây là lệnh.

ls Documents ABC> dirlist 2>&1

Sơ đồ bên dưới cho thấy cả hai luồng dữ liệu được ghi lại trong cùng một tệp.

Sơ đồ thể hiện đầu ra chuẩn và lỗi chuẩn đều được chuyển hướng đến thư mục tệp dirlist.

Đây:

  • 2>&1 có nghĩa là STDERR được chuyển hướng đến cùng một đích với STDOUT (đó là danh sách thư mục tệp).
  • Thông báo lỗi được chuyển hướng đến đầu ra chuẩn, sau đó được chuyển hướng đến danh sách thư mục tệp. Do đó, cả hai luồng đều được ghi vào danh sách thư mục tệp.

Sơ đồ dưới đây tóm tắt cách thức hoạt động phối hợp giữa đầu vào, đầu ra và chuyển hướng lỗi.

Sơ đồ tóm tắt quá trình chuyển hướng đầu vào, đầu ra và lỗi trong Linux và Unix.

Câu Hỏi Thường Gặp

A đường ống (|) gửi trực tiếp đầu ra của một lệnh vào một lệnh khác làm đầu vào. Ngược lại, chuyển hướng kết nối một lệnh với một tệp hoặc thiết bị, ghi đầu ra vào đó hoặc đọc đầu vào từ đó. Đường ống nối các lệnh; chuyển hướng nối một lệnh với một tệp.

Toán tử > ghi kết quả đầu ra của lệnh vào một tệp, thay thế bất kỳ nội dung hiện có nào. Toán tử >> thì thêm kết quả đầu ra vào cuối tệp, giữ nguyên nội dung hiện có.ping Những gì đã có sẵn. Sử dụng >> bất cứ khi nào bạn muốn thêm vào một tệp thay vì ghi đè lên tệp đó.

/dev/null là một tập tin đặc biệt có chức năng loại bỏ mọi thứ được ghi vào đó. Thêm 2>/dev/null vào một lệnh sẽ chuyển hướng các thông báo lỗi của lệnh đó đến tập tin này, âm thầm loại bỏ chúng để chỉ có đầu ra bình thường xuất hiện trên màn hình. Đây là một cách phổ biến để ẩn các thông báo lỗi không mong muốn.

Lệnh `tee` đọc dữ liệu từ thiết bị đầu vào chuẩn và ghi dữ liệu đồng thời ra màn hình và một hoặc nhiều tệp, ví dụ: `ls -al | tee listing.txt`. Nó cho phép bạn lưu kết quả đầu ra của một lệnh vào tệp trong khi vẫn xem được trên màn hình.

Tài liệu here document sử dụng toán tử << để truyền nhiều dòng văn bản nội tuyến vào lệnh, kết thúc tại một từ đánh dấu do bạn chọn. Nó rất tiện dụng trong các script shell để truyền dữ liệu nhiều dòng, chẳng hạn như nội dung email, mà không cần tạo file riêng.

Sử dụng cú pháp 2>&1 sau khi chuyển hướng đầu ra, ví dụ như lệnh > file 2>&1, để lỗi chuẩn theo sau đầu ra chuẩn vào tệp. Trong Bash hiện đại, lệnh viết tắt &> file cũng thực hiện điều tương tự. Thứ tự rất quan trọng: đặt 2>&1 sau khi chuyển hướng đầu ra.

Các trợ lý AI có thể chuyển yêu cầu bằng tiếng Anh thông thường thành lệnh chuyển hướng chính xác, giải thích chức năng của các toán tử như 2>&1 hoặc &> và phát hiện lỗi trước khi bạn thực thi chúng. Các công cụ học máy cũng quét các tệp nhật ký và lỗi được chuyển hướng để tìm ra những bất thường mà việc xem xét thủ công sẽ bỏ sót.

Vâng. Trợ lý GitHub Có thể tạo ra các lệnh và tập lệnh chuyển hướng đầu vào, đầu ra và lỗi từ một đoạn chú thích ngắn mô tả mục tiêu, và tự động hoàn thành chúng khi bạn gõ. RevHãy xem xét bất kỳ lệnh nào được đề xuất đối với các tệp của bạn, đặc biệt là các lệnh sử dụng > ghi đè lên dữ liệu hiện có.

Tóm tắt bài viết này với: