Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Lập Trình Bash

Làm chủ chuyển hướng (Redirection) Terminal Linux: Đọc & ghi dữ liệu từ bất kỳ đâu

Chuyển hướng input/output là chức năng tự nhiên bất kỳ ngôn ngữ lập trình/scripting nào. Về mặt kỹ thuật, nó xảy ra tự nhiên khi bạn tương tác máy tính. Input đọc từ stdin (standard input, thường bàn phím/chuột), output ra stdout (standard output, luồng text/data), lỗi gửi stderr. Hiểu các luồng dữ liệu tồn tại cho phép kiểm soát thông tin đi đâu khi dùng shell, như Bash hoặc Zsh.

Standard in, standard out, standard error tồn tại như vị trí filesystem trên Linux. Bạn thấy chúng trong /dev:

$ ls /dev/std*
/dev/stderr@ /dev/stdin@ /dev/stdout@

Bạn không làm nhiều trực tiếp với chúng, nhưng hữu ích nghĩ đến chúng như meta-locations gửi dữ liệu.

Cơ bản chuyển hướng đơn giản: dùng số > chuyển hướng output, số < chuyển hướng input.

Chuyển hướng output

Để ghi output lệnh ls vào file:

$ ls > list.txt

Bạn không thấy output ls như bình thường, vì output ghi vào list.txt thay vì màn hình. Rất linh hoạt, thậm chí dùng copy nội dung file này sang file khác. Không phải file text, dùng cho dữ liệu nhị phân:

$ cat image.png > picture.png

(Nếu thắc mắc tại sao muốn làm vậy, đó là repercussion đôi khi hữu ích trên quyền file.)

Chuyển hướng input

Bạn cũng chuyển hướng input "vào" lệnh. Thường ít hữu ích hơn chuyển hướng output vì nhiều lệnh hard-coded nhận input từ tham số bạn đưa. Có thể hữu ích khi lệnh kỳ vọng danh sách tham số, bạn có chúng trong file và muốn nhanh "copy-paste" từ file vào terminal (trừ không thực sự copy-paste):

$ sudo dnf install $(<package.list)

Cách dùng phổ biến input redirection là here-document (hay here-doc) và here-string. Phương pháp input này chuyển hướng khối text vào luồng standard input, đến marker end-of-file đặc biệt (thường dùng EOF, nhưng có thể chuỗi bất kỳ bạn kỳ vọng duy nhất). Thử gõ này (đến EOF thứ hai) vào terminal:

$ echo << EOF
> foo
> bar
> baz
> EOF

Kết quả mong đợi:

foo
bar
baz

Here-doc là thủ thuật thường dùng Bash scripter đổ vài dòng text vào file hoặc màn hình. Miễn không quên kết thúc clause với marker end-of-file, cách hiệu quả tránh danh sách echo hoặc printf cồng kềnh.

Here-string giống here-doc, nhưng chỉ một chuỗi (hoặc vài chuỗi ngụy trang thành một chuỗi với ngoặc kép):

$ cat <<< "foo bar baz"
foo bar baz

Chuyển hướng thông báo lỗi

Thông báo lỗi đi luồng stderr, chỉ định 2> cho chuyển hướng. Lệnh này chuyển lỗi ra file output.log:

$ ls /nope 2> output.log

Gửi dữ liệu đến /dev/null

Cũng như có vị trí standard in, out, error, cũng có vị trí nghịch ngợm trên filesystem Linux. Gọi null, ở /dev, thường phát âm "devnull" bởi người dùng thường xuyên không muốn nói "slash dev slash null".

Bạn gửi dữ liệu đến /dev/null dùng chuyển hướng. Ví dụ, find hay verbose, thường báo xung đột quyền khi tìm file:

$ find ~ -type f
/home/seth/actual.file
find: `/home/seth/foggy': Permission denied
find: `/home/seth/groggy': Permission denied
find: `/home/seth/soggy': Permission denied
/home/seth/zzz.file

Lệnh find xử lý như lỗi, nên chuyển hướng chỉ lỗi đến /dev/null:

$ find ~ -type f 2> /dev/null
/home/seth/actual.file
/home/seth/zzz.file

Sử dụng chuyển hướng

Chuyển hướng là cách hiệu quả đưa dữ liệu từ nơi này sang nơi khác trong Bash. Bạn có thể không dùng chuyển hướng luôn, nhưng học dùng khi cần thiết tiết kiệm nhiều mở file copy-paste vô ích, đòi hỏi di chuột và gõ phím nhiều. Đừng诉诸 cực đoan. Sống tốt và dùng chuyển hướng.