Redirection (computing)

Trong điện toán, chuyển hướng là một hình thức giao tiếp giữa các tiến trình và là một chức năng phổ biến đối với hầu hết các trình thông dịch dòng lệnh, bao gồm các shell Unix khác nhau có thể chuyển hướng các luồng tiêu chuẩn đến các vị trí do người dùng chỉ định.
Trong các hệ điều hành giống Unix, các chương trình thực hiện chuyển hướng với lệnh gọi hệ thống dup2 (2) hoặc kém linh hoạt hơn nhưng mức độ cao hơn tương tự stdio là, freopen (3) và popen (3).

Chuyển hướng đầu vào tiêu chuẩn và đầu ra tiêu chuẩn

Chuyển hướng thường được thực hiện bằng cách đặt các ký tự nhất định giữa các lệnh.

Căn bản

Thông thường, cú pháp như sau, sử dụng < để chuyển hướng đầu vào và > để chuyển hướng đầu ra. command1 > file1 thực thi command1, đặt đầu ra trong file1. Điều này sẽ ghi đè bất kỳ dữ liệu hiện có trong tệp1.
Sử dụng command1 < file1 thực thi command1, với file1 là nguồn đầu vào.
command1 < infile > outfile kết hợp hai khả năng: command1 đọc từ infile và ghi vào outfile

Biến thể

Để thêm vào cuối của tập tin, chứ không phải là ghi đè nó,>> được sử dụng: command1 >> file1.
Để đọc từ một chuỗi các dòng (một tập tin nhiều dòng, truyền từng dòng tới các đầu vào tiêu chuẩn), người ta có thể sử dụng một here document, sử dụng<<:
1 tr a-z A-Z << END_TEXT
2 one two three
3 uno dos tres
4 END_TEXT
Để đọc từ một chuỗi, người ta có thể sử dụng một here string, sử dụng<<<: tr a-z A-Z <<< "one two three", hoặc là:
NUMBERS="one two three"
tr a-z A-Z <<< "$NUMBERS"

Đường ống

thumb| Một đường dẫn gồm ba chương trình chạy trên text terminal. Các chương trình có thể được chạy cùng nhau sao cho một chương trình đọc đầu ra từ một chương trình khác mà không cần tệp trung gian rõ ràng. command1 | command2 thực thi command1, sử dụng đầu ra của nó làm đầu vào cho command2 (thường được gọi là đường ống, với ký tự "|" được gọi là "pipe").
Hai chương trình thực hiện các lệnh có thể chạy song song với không gian lưu trữ duy nhất là bộ đệm làm việc (Linux cho phép tối đa 64K cho mỗi bộ đệm) cộng với bất kỳ không gian làm việc nào mà mỗi lệnh xử lý yêu cầu. Ví dụ, lệnh "sort" không thể tạo ra bất kỳ đầu ra nào cho đến khi tất cả các bản ghi đầu vào đã được đọc, vì bản ghi cuối cùng nhận được có thể trở thành đầu tiên theo thứ tự được sắp xếp. Hệ điều hành thử nghiệm của Tiến sĩ Alexia Massalin, Synthesis, sẽ điều chỉnh mức độ ưu tiên của từng tác vụ khi chúng chạy theo mức độ đầy đủ của bộ đệm đầu vào và đầu ra.
Điều này tạo ra kết quả cuối cùng giống như sử dụng hai chuyển hướng và một tệp tạm thời, như cặp lệnh dưới đây:
1 command1 > tempfile
2 command2 < tempfile
3 rm tempfile
Nhưng ở đây, command2 không bắt đầu thực thi cho đến khi command1 kết thúc và một tệp tạm thời đủ lớn được yêu cầu để giữ kết quả trung gian cũng như bất kỳ không gian làm việc nào mà mỗi tác vụ yêu cầu. Ví dụ, mặc dù DOS cho phép cú pháp "pipe", nhưng nó sử dụng cách tiếp cận thứ hai này. Do đó, giả sử một số chương trình chạy trong thời gian dài, "Worker" tạo ra các thông báo khác nhau khi nó hoạt động và chương trình thứ hai, TimeStamp sao chép từng bản ghi từ stdin sang stdout, thêm vào phía trước ngày và giờ của hệ thống khi nhận được bản ghi. Một chuỗi như Worker | TimeStamp > LogFile.txt sẽ chỉ điền thời gian khi Worker đã hoàn thành vào dòng đầu tiên, và ghi thời gian đọc và ghi tệp đầu ra của nó ở các dòng tiếp theo.
Một ví dụ điển hình cho đường ống lệnh là kết hợp echo với một lệnh khác để đạt được thứ gì đó tương tác trong một shell không tương tác, ví dụ echo -e 'user\npass'| ftp localhost. Điều này chạy ứng dụng khách ftp với user đầu vào, nhấn return, sau đó pass.
Trong sử dụng thông thường, bước đầu tiên của một đường ống thường là cat hoặc echo, đọc từ tệp hoặc chuỗi. Điều này thường có thể được thay thế bằng chỉ định đầu vào hoặc here string và sử dụng cat và đường ống thay vì chuyển hướng đầu vào được gọi là sử dụng cat vô dụng. Ví dụ: các lệnh sau:
1 cat infile | cmd
2 echo $string | cmd
3 echo -e 'user\npass' | ftp localhost
có thể được thay thế bởi:
1 cmd < infile
2 cmd <<< $string
3 ftp localhost <<< $'user\npass'
Vì echo thường là một lệnh shell nội bộ, nên việc sử dụng nó không bị chỉ trích như cat, là một lệnh bên ngoài.

Chuỗi đường ống

Các mã thông báo chuyển hướng và đường ống có thể được nối lại với nhau để tạo ra các lệnh phức tạp. Ví dụ: sort infile | uniq -c | sort -n > outfile sắp xếp các dòng của infile theo thứ tự từ điển, viết các dòng duy nhất với tiền tố là số lần xuất hiện, sắp xếp các dòng theo số lần xuất hiện và ghi vào outfile. Kiểu xây dựng này được sử dụng rất phổ biến trong các tập lệnh shell và tập tin bó.

Chuyển hướng đến nhiều đầu ra

Lệnh chuẩn tee có thể chuyển hướng đầu ra từ một lệnh đến một số địa điểm: ls -lrt | tee xyz. Điều này chỉ đạo đầu ra danh sách tập tin cho cả đầu ra tiêu chuẩn và tập tin xyz.