Trước khi shell thực thi cat
lệ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 cat
tiệ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 cat
lệ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 file
và cat <file
(hoặc, nếu bạn sẽ, <file cat
) là trong trường hợp đầu tiên, cat
chí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 cat
luồng đầu vào của nó với it². Trong trường hợp thứ hai, cat
sẽ 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 cat
và 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.
cat
cũ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 cat
và đố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 cat
trê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ụ, file1
sẽ không được rút ngắn nếu file2
là 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). cat
Tuy 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 file
trước khi thực hiện sort file
và kết nối sort
đầu ra tiêu chuẩn của tệp với tệp. Các sort
tiện ích sau đó sẽ mở ra file
và 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ì sort
làm khi sử dụng -o
tệ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]