Sự khác biệt giữa mèo Mèo và con mèo <<


70

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.txtcat < 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:


106

Trong trường hợp đầu tiên, catmở 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 catchươ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à catkhông phải là cùng một chương trình.


83
Vâng, và ví dụ bạn có thể làm sudo cat myfile.txt. Nhưng sudo cat < myfile.txtsẽ không hoạt động nếu bạn không có đặc quyền để đọc tệp.
zuazo

2
Lưu ý rằng ksh93đã catdựng sẵn (không được bật theo mặc định trừ khi bạn có /opt/ast/binsớm $PATHmặc dù).
Stéphane Chazelas 2/2/2016

2
Một số chương trình hoạt động khác nhau tùy thuộc vào việc chúng có được đối số tên tệp hay stdin hay không. Chẳng hạn, wcsẽ in tên tệp trước khi đếm khi được đưa ra một đối số.
Barmar

21

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.txttrong 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, catsẽ 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, cattrong 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 catkhi bạn sử dụng zshmultios"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à catkhô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 catcá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.


5
Vì tò mò, bạn có thực sự sử dụng kshý chí của riêng mình không, và nếu vậy ... tại sao ?
con mèo

1
@cat - Câu hỏi đó rõ ràng là dựa trên sự thiếu hiểu biết. xây dựng nó và xem.
mikeerv

2
@mikeerv đã được dự định là flippant, không nghiêm túc thô lỗ, nhưng đủ công bằng, tôi cho rằng
con mèo

2
@cat - tôi không cho là khác. thiếu hiểu biết không phải là một điều đáng xấu hổ - nó chỉ là một sự thiếu hiểu biết. nếu bạn không hiểu tại sao ai đó có thể chọn sử dụng ksh93, thì tôi chỉ có thể cho rằng đó là vì bạn chưa bao giờ sử dụng nó. vì vậy tôi khuyên bạn nên làm nó đáng để thử, để chắc chắn và tin tôi khi tôi nói với bạn rằng, so với bash, ksh93là xa và vỏ tốt hơn. nó gần như là cái vỏ
mikeerv

5
Như @mikeerv đã chỉ ra ở nơi khác , cat < file1 > file2có tác dụng rất khác so cat file1 > file2với trường hợp file1khô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.)
Wildcard

7

cat myfile.txtđọc tập tin myfile.txtsau đó in nó ra đầu ra tiêu chuẩn.

cat < myfile.txtở đây catkhô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.txtbởi trình bao và in ra đầu ra tiêu chuẩn.


6

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 <file3sẽ 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 file3sẽ đọ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.


1
Lưu ý rằng trong ví dụ đầu tiên của bạn catsẽ vẫn mở file1file2, tương tự với file4file5trong ví dụ thứ ba của bạn. Nó sẽ chỉ hiển thị file3, tôn trọng. file6nội dung nếu các hướng dẫn mở trước đó thành công.
jlliagre

@jlliagre, cảm ơn, tôi không biết điều đó. Strace rõ ràng đã chứng minh sự đúng đắn của bạn. Tôi đã sửa văn bản ngoặc đơn cho các trường hợp 1 và 3a.
sasha

0

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ó.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.