Shell Linux/Bash có ba luồng dữ liệu (data streams) bạn có thể tận dụng khi chạy lệnh – stdin, stdout, và stderr. Đây là cách dùng chúng.
stdin, stdout, stderr cho phép hiển thị text trên console, và dữ liệu output từng luồng có thể chuyển hướng vào chương trình khác.
Chúng gọi là Standard Streams (Luồng chuẩn).
stdin (Standard Input) là gì?
Luồng input text.
Ứng dụng có thể nhận text qua stdin làm input.
stdout (Standard Output) là gì?
Luồng output text của chương trình.
Ứng dụng gửi dữ liệu cho chương trình khác (hoặc console để xem) qua stdout.
stderr (Standard Error) là gì?
Luồng output lỗi text của chương trình.
Nếu chương trình gặp lỗi, nó nên gửi dữ liệu lỗi ra qua luồng stderr (sửa: bài gốc viết stdout nhưng ý nói stderr).
…Vậy thực tế nghĩa là gì?
Chương trình máy tính xử lý input/output – ví dụ chương trình nhận phương trình toán và đưa ra giải pháp.
Bạn cần cách đưa phương trình VÀO chương trình và cách lấy đáp án RA khỏi chương trình. Bạn cũng muốn biết nếu phương trình vô nghiệm, nên thấy ERROR riêng biệt từ OUTPUT khác.
Đó là stdin, stdout, và stderr.
Vì mọi thứ hoạt động cùng cách làm cho đời dễ dàng, các luồng input, output, error đã chuẩn hóa để ứng dụng dòng lệnh đều hoạt động giống nhau.
Do đó, Standard Streams. Mỗi luồng có định danh số 0-3:
| Số | Luồng |
|---|---|
| 0 | stdin |
| 1 | stdout |
| 2 | stderr |
Chuyển hướng/Piping từ stdin, stdout, stderr trong Bash/Shell
Bạn gõ vào Linux shell là luồng text – bạn gõ, luồng text đưa vào input console.
Ứng dụng chạy, dữ liệu text output từ nó đưa vào console hiển thị để bạn đọc.
Đây là hành vi mặc định trên console, nhưng có thể thay đổi. Luồng có thể chuyển hướng – ví dụ output chương trình chuyển thẳng vào file thay vì console.
Output từ chương trình này có thể chuyển hướng vào input chương trình khác trực tiếp.
Dưới đây ví dụ cơ bản dùng redirection và piping.
Redirection (Chuyển hướng)
Thường lệnh echo in text ra console:
echo "hello there!"
stdout của echo đi đường mặc định hiển thị màn hình.
Redirection cho phép gửi đâu đó khác. Ở đây gửi vào file:
echo "hello there!" > test.txt
File test.txt tạo ra chứa text “hello there!” (cẩn thận, nếu file đã tồn tại, sẽ bị ghi đè).
Thêm vào file bằng >> thay vì >
Tiếp, chuyển hướng stdin dùng <
cat < test.txt
Lệnh cat đọc nội dung test.txt vào luồng stdin rồi làm nhiệm vụ của cat – in dữ liệu cung cấp ra stdout, mặc định console. Vậy sẽ in hello there! ra console.
Dữ liệu trong file chuyển hướng vào stdin cho cat – đã redirect.
Hơi "lách luật", cat đọc từ filename truyền param không cần pipe, nhưng là lệnh đơn giản nhất cho ví dụ.
Chuyển hướng stdin và stdout cùng lúc:
cat < test.txt > output.txt
stdin redirect, đọc test.txt vào cat, stdout từ cat redirect vào file output.txt.
Lại "lách luật" vì thực chất dùng cat copy file, nhưng ví dụ đơn giản không cần giải thích lệnh khác.
Cuối cùng, chuyển hướng luồng stderr bằng cách chỉ định số định danh duy nhất (vì stdout là mặc định, không cần chỉ định):
cat nofile.txt 2> error.txt
stderr có số định danh 2 – nếu cat sinh lỗi, gửi qua luồng này vào file error.txt.
Ví dụ tạo file error.txt chứa:
cat: nofile.txt: No such file or directory
…vì cat không tìm thấy file nofile.txt.
Chuyển hướng đồng thời
Trong ví dụ trên, stderr xác định bằng số định danh – nghĩa là bạn có thể redirect stdout và stderr cùng lúc bằng cách chỉ định luồng nào:
echo "hello there!" 1>test.txt 2>error.txt
Trên, stdout gửi test.txt, stderr gửi error.txt.
Piping (Ống dẫn)
Piping giống redirection nhưng chỉ xử lý stdin, stdout, lỗi bị bỏ qua.
echo "hello there!" | cat
Ống (|) pipe (chuyển hướng) stdout của echo tới stdin của cat.
Kết luận
Làm việc với ứng dụng dòng lệnh có vẻ không trực quan ban đầu, nhưng là công cụ mạnh khi tự động hóa tác vụ. stdin, stdout, và stderr – standard streams là nền tảng sự linh hoạt – bạn có thể nối chuỗi lệnh tạo workflow phức tạp xử lý hầu như mọi tác vụ.