Computer >> Hướng Dẫn Máy Tính >  >> Điện Thoại Thông Minh >> Linux

Cách lưu đầu ra lệnh Linux ra tệp (Output Redirection)

Hướng dẫn các phương pháp lưu kết quả lệnh (stdout/stderr) vào tệp trong Linux.

1. Toán tử chuyển hướng (Redirection Operators) – Cách phổ biến nhất

Ghi đè (Overwrite) – >

# ls /var/log > /tmp/varlog.log
  • Tạo file mới hoặc xóa trắng nội dung cũ rồi ghi.
  • Chỉ chuyển hướng stdout (file descriptor 1).

Ghi nối (Append) – >>

# ls /var/log >> /tmp/varlog.log
  • Thêm nội dung vào cuối file, giữ nội dung cũ.

Chuyển hướng stderr – 2>

# command 2> error.log

Chuyển hướng cả stdout và stderr

# command > output.log 2>&1        # Cách cũ (Bash/Sh)
# command &> output.log            # Cách ngắn (Bash/Zsh)
# command > output.log 2>&1        # POSIX compliant

Ghi nối cả stdout và stderr

# command >> output.log 2>&1
# command &>> output.log           # Bash 4+

2. Lệnh tee – Xem trên màn hình VÀ ghi file cùng lúc

# command | tee output.log           # Ghi đè
# command | tee -a output.log        # Ghi nối
# command | tee output.log > /dev/null  # Chỉ ghi file, không hiện màn hình
  • Hữu ích khi chạy script tự động nhưng vẫn muốn theo dõi real-time.

3. Lệnh logsave – Có timestamp (ít dùng)

# logsave /tmp/varlog.log ls /var/log        # Ghi đè
# logsave -a /tmp/varlog.log ls /var/log     # Ghi nối (-a append)
  • Thêm ngày/giờ vào đầu file log.
  • Output sạch hơn redirection thuần.
  • Không phổ biến như >/tee.

4. Script – Tự động log mọi lệnh (session logging)

# script -t 2> timing.log -c "commands" > session.log
# Hoặc phiên tương tác:
# script session.log
# ... gõ lệnh ...
# exit

5. So sánh nhanh

Phương phápStdoutStderrHiện màn hìnhTimestampPhổ biến
> / >>✅❌❌❌⭐⭐⭐⭐⭐
2> / 2>>>❌✅❌❌⭐⭐⭐
&> / &>>>✅✅❌❌⭐⭐⭐⭐
tee✅❌ (cần 2>&1)✅❌⭐⭐⭐⭐
logsave✅❌❌✅⭐⭐
script✅✅✅✅ (với -t)⭐⭐⭐

Mẹo hay

  • command 2>&1 | tee -a log.txt: Xem real-time + ghi cả stdout/stderr nối đuôi.
  • exec > >(tee -a /var/log/myscript.log) 2>&1: Đặt đầu script để log toàn bộ session script.
  • Dùng logger gửi log đến syslog: logger -t myscript "Message".