Trước khi shell thực thi catlệnh trên dòng lệnh, nó sẽ tìm chuyển hướng.
Có hai chuyển hướng:
>file1 Điều này sẽ làm cho đầu ra tiêu chuẩn của lệnh đi đến file1.
<file2 Điều này sẽ làm cho đầu vào tiêu chuẩn của lệnh đến từ file2.
Việc các chuyển hướng này được đặt ở một vị trí thuận lợi trên dòng lệnh không thành vấn đề.
$ cat <file2 >file1
giống như
$ <file2 cat >file1
giống như
$ <file2 >file1 cat
v.v ...
Lưu ý rằng cattiện ích trong tất cả các trường hợp này được thực thi mà không có bất kỳ đối số dòng lệnh nào . Các chuyển hướng không phải là toán hạng cho catlệnh, chúng là các lệnh cho shell để thiết lập các chuyển hướng vào và ra lệnh (kết nối đầu vào và đầu ra tiêu chuẩn của nó với các tệp). Shell thiết lập các chuyển hướng trước khi gọi lệnh.
Sự khác biệt giữa cat filevà cat <file(hoặc, nếu bạn sẽ, <file cat) là trong trường hợp đầu tiên, catchính tiện ích đang mở tệp, được đưa ra dưới dạng toán hạng trên dòng lệnh, để đọc, trong trường hợp thứ hai, trình bao sẽ mở tệp và kết nối catluồng đầu vào của nó với it². Trong trường hợp thứ hai, catsẽ nhận thấy rằng nó không được cung cấp một toán hạng tệp và sẽ tự động chuyển sang đọc từ đầu vào tiêu chuẩn của nó. Đây là một tính năng của catvà một số tiện ích khác, không phải là thứ mà tất cả các tiện ích đều làm được.
catcũng sẽ đọc từ đầu vào tiêu chuẩn của nó nếu nó được đưa ra toán hạng -. Một lần nữa, điều này chỉ đặc biệt đối với catvà đối với một số tiện ích khác (tức là không có gì mà shell làm được). Để sử dụng cattrên một tập tin trong thư mục hiện có tên là - , thêm một đường dẫn đến tên tập tin, chẳng hạn như ./-.
¹ Thứ tự của các chuyển hướng là vẫn quan trọng trong một số hoàn cảnh; Với cat <file2 >file1, ví dụ, file1sẽ không được rút ngắn nếu file2là không thể tiếp cận (các chuyển hướng được phân tích cú pháp từ trái sang phải). catTuy nhiên, vị trí tương đối của từ này vẫn tùy ý và sẽ không ảnh hưởng đến điều này.
² Xem thêm câu hỏi " con mèo đưa ra lỗi khác nhau khi mở tệp không tồn tại ".
Việc shell thiết lập các chuyển hướng trước khi thực hiện lệnh trên dòng lệnh là lý do tại sao những thứ như thế này thất bại và bạn kết thúc với một tệp đầu ra trống:
$ sort file >file
Ở đây, shell sẽ cắt bớt (trống) tệp filetrước khi thực hiện sort filevà kết nối sortđầu ra tiêu chuẩn của tệp với tệp. Các sorttiện ích sau đó sẽ mở ra filevà sắp xếp nội dung của nó (đó là gì). Kết quả (không có gì) được truyền qua luồng đầu ra tiêu chuẩn đến file.
Biện pháp khắc phục trong trường hợp cụ thể này (để sắp xếp một tệp "tại chỗ") là
$ sort -o file file
hoặc là
$ sort file >file.sorted && mv file.sorted file
đó là nhiều hay ít những gì sortlàm khi sử dụng -otệp để chỉ định tên tệp đầu ra.
Chỉ cần sao lưu tuyên bố rằng các chuyển hướng có thể đặt trước tên thực của tiện ích trên dòng lệnh:
"Lệnh đơn giản" là một chuỗi các phép gán và chuyển hướng tùy chọn, trong bất kỳ chuỗi nào, tùy ý theo sau là các từ và chuyển hướng, được chấm dứt bởi một toán tử điều khiển. [ref: POSIX Shell Ngôn ngữ lệnh 2.9.1 Các lệnh đơn giản]
Và cũng về việc chuyển hướng không phải là một phần của toán hạng của tiện ích:
Số tùy chọn, toán tử chuyển hướng và từ sẽ không xuất hiện trong các đối số được cung cấp cho lệnh sẽ được thực thi (nếu có). [ref: POSIX Shell Ngôn ngữ lệnh 2.7 Chuyển hướng]