Tôi đã làm việc thông qua một hướng dẫn và thấy sử dụng cả hai cat myfile.txt
và cat < myfile.txt
. Có sự khác biệt giữa hai chuỗi lệnh này không? Dường như cả hai in nội dung của một tập tin vào vỏ.
Tôi đã làm việc thông qua một hướng dẫn và thấy sử dụng cả hai cat myfile.txt
và cat < myfile.txt
. Có sự khác biệt giữa hai chuỗi lệnh này không? Dường như cả hai in nội dung của một tập tin vào vỏ.
Câu trả lời:
Trong trường hợp đầu tiên, cat
mở tệp và trong trường hợp thứ hai, shell sẽ mở tệp, chuyển nó dưới dạng cat
đầu vào tiêu chuẩn.
Về mặt kỹ thuật, chúng có thể có hiệu ứng khác nhau. Ví dụ, có thể có một triển khai shell được đặc quyền nhiều hơn (hoặc ít hơn) so với cat
chương trình. Đối với kịch bản đó, một người có thể không mở tệp, trong khi người kia có thể.
Đó không phải là kịch bản thông thường, nhưng được đề cập để chỉ ra rằng shell và cat
không phải là cùng một chương trình.
sudo cat myfile.txt
. Nhưng sudo cat < myfile.txt
sẽ không hoạt động nếu bạn không có đặc quyền để đọc tệp.
ksh93
đã cat
dựng sẵn (không được bật theo mặc định trừ khi bạn có /opt/ast/bin
sớm $PATH
mặc dù).
wc
sẽ in tên tệp trước khi đếm khi được đưa ra một đối số.
Không có sự khác biệt lớn có thể nhìn thấy trong trường hợp thử nghiệm của bạn. Thông báo rõ ràng nhất sẽ là thông báo lỗi bạn nhận được nếu không có tệp có tên myfile.txt
trong thư mục hiện tại hoặc nếu bạn không được phép đọc nó.
Trong trường hợp trước, cat
sẽ khiếu nại và trong trường hợp sau, trình bao của bạn sẽ, hiển thị rõ ràng quá trình nào đang cố mở tệp, cat
trong trường hợp trước và trình bao trong trường hợp sau.
$ cat myfile.txt
cat: myfile.txt: No such file or directory
$ cat < myfile.txt
ksh93: myfile.txt: cannot open [No such file or directory]
Trong trường hợp tổng quát hơn, một sự khác biệt lớn là sử dụng chuyển hướng không thể được sử dụng để in nội dung của nhiều tệp, sau tất cả mục đích ban đầu của lệnh cat
(tức là cat enate). Lưu ý rằng shell dù sao cũng sẽ cố gắng mở tất cả các tệp được chuyển dưới dạng đầu vào được chuyển hướng, nhưng thực tế chỉ chuyển cái cuối cùng cho đến cat
khi bạn sử dụng zsh
và multios
"zshism" của nó .
$ echo one > one
$ echo two > two
$ cat one two # cat opens one, shows one, opens two, shows two
one
two
$ cat < one < two # sh opens one then opens two, cat shows stdin (two)
two
$ rm one two
$ echo one > one
$ cat one two # cat opens and shows one, fails to open two
one
cat: two: No such file or directory
$ cat < one < two # the shell opens one then opens two, fails and
# displays an error message, cat gets nothing on stdin
# so shows nothing
ksh93: two: cannot open [No such file or directory]
Trên một hệ thống tiêu chuẩn, hệ vỏ và cat
không có sự khác biệt về quyền truy cập tệp nên cả hai sẽ thành công khi thất bại như nhau. Sử dụng sudo
để nâng cao cat
các đặc quyền sẽ tạo ra sự khác biệt lớn trong hành vi, như Thomas Dickey trả lời và các bình luận đính kèm đã được đề xuất.
ksh
ý chí của riêng mình không, và nếu vậy ... tại sao ?
bash
, ksh93
là xa và vỏ tốt hơn. nó gần như là cái vỏ
cat < file1 > file2
có tác dụng rất khác so cat file1 > file2
với trường hợp file1
không thể đọc được hoặc không tồn tại. (Mẫu sau cắt ngắn file2
; mẫu trước sẽ không.)
cat myfile.txt
đọc tập tin myfile.txt
sau đó in nó ra đầu ra tiêu chuẩn.
cat < myfile.txt
ở đây cat
không được cung cấp bất kỳ tệp nào để mở, do đó, giống như nhiều lệnh Unix đọc dữ liệu từ đầu vào tiêu chuẩn, được hướng từ đó file.txt
bởi trình bao và in ra đầu ra tiêu chuẩn.
Câu trả lời của @Thomas Dickey thật tuyệt vời.
Tôi chỉ muốn thêm một số sự thật rõ ràng về trường hợp đọc một số tệp (liên quan một cách lỏng lẻo đến câu hỏi của bạn, nhưng vẫn):
cat <file1 <file2 <file3
sẽ chỉ đọc file3, ít nhất là trong bash. (Trên thực tế, nó phụ thuộc vào vỏ, nhưng hầu hết vỏ sẽ dup mỗi file được chỉ định để stdin, khiến người cuối cùng để có hiệu lực.)cat file1 file2 file3
sẽ đọc tất cả các tệp được chỉ định một cách tuần tự (thực ra con mèo là dạng rút gọn của từ ghép ).cat file1 file2 file3 <file4 <file5 <file6
sẽ chỉ đọc file1, file2, file3 (vì cat bỏ qua stdin khi các đối số tên tệp được truyền).
cat file1 file2 - file3 <file4 <file5 <file6
sẽ đọc file1, file2, file6, file3 (vì dấu gạch nối buộc mèo không bỏ qua stdin).Và về lỗi. Trong trường hợp không thể mở một số tệp được chỉ định làm đối số (không có <
), cat sẽ bỏ qua các tệp không thành công (với việc xuất thông báo có liên quan đến stderr), nhưng vẫn đọc các tệp khác. Trong trường hợp không thể mở ít nhất một trong các tệp được chỉ định là chuyển hướng (có <
), shell sẽ không khởi động được mèo (điều này xảy ra ngay cả đối với các chuyển hướng thực sự không được sử dụng bởi mèo). Trong cả hai trường hợp, mã thoát sai sẽ được trả lại.
cat
sẽ vẫn mở file1
và file2
, tương tự với file4
và file5
trong ví dụ thứ ba của bạn. Nó sẽ chỉ hiển thị file3
, tôn trọng. file6
nội dung nếu các hướng dẫn mở trước đó thành công.
chúng ta có thể sử dụng một lệnh khác để nhận thấy sự khác biệt giữa:
wc –w food2.txt
.
Sản lượng có thể:
6 food2.txt
.
lệnh cho biết tên tệp vì nó biết nó (được truyền dưới dạng đối số).
wc –w < food2.txt
.
Sản lượng có thể:
6
.
đầu vào tiêu chuẩn được chuyển hướng đến tệp food2.txt mà không có lệnh biết về nó.