Một khái niệm nền tảng trong Linux shell là mọi dữ liệu vào/ra đều được xử lý như dòng dữ liệu (stream). Điều này áp dụng cả cho dữ liệu đầu vào, dữ liệu đầu ra, và cả thông báo lỗi. Linux định nghĩa ba luồng dữ liệu chuẩn:
-
STDOUT (Standard Output): Luồng xuất dữ liệu tiêu chuẩn, mặc định gửi ra màn hình, nhưng có thể chuyển hướng (redirect) sang tệp, thiết bị hoặc chương trình khác.

1. STDIN – Luồng Nhập Tiêu Chuẩn
Khi không chỉ định tệp, cat sẽ đọc dữ liệu từ STDIN (bàn phím), và xuất ra STDOUT (màn hình).
Hoặc dùng ký hiệu < để chuyển nội dung tệp thành STDIN cho lệnh:
2. STDOUT – Luồng Xuất Tiêu Chuẩn
Ví dụ với biến môi trường $PATH:
Chuyển hướng STDOUT sang tệp:
Ký hiệu > ghi đè tệp (clobbering).
Dùng >> để ghi nối tiếp (append):
echo "More test data" >> path.txt
3. STDERR – Luồng Xuất Lỗi
ls -al abc123.txt > output.txt
Tệp abc123.txt không tồn tại, thông báo lỗi vẫn hiện trên màn hình vì nó đi qua STDERR, không phải STDOUT.
Chuyển hướng lỗi ra "hố đen" /dev/null:
ls -al abc123.txt > output.txt 2> /dev/null
Chuyển hướng lỗi sang tệp log:
ls -al abc123.txt > output.txt 2> errors.txt
4. Kỹ thuật Kết hợp
Tips thực chiến: Trong các script giám sát hoặc automation, việc tách STDOUT và STDERR giúp phân loại dữ liệu kết quả và thông tin lỗi, hỗ trợ debug dễ dàng hơn. Trong môi trường SOC hoặc DevOps, kỹ thuật redirect còn được dùng để thu thập log và giám sát tiến trình.