Tại sao lệnh này tạo ra một tệp rất lớn?


19

Hôm nay tôi đã thử nghiệm một số thao tác bổ sung và, vì tò mò, tôi đã chạy cái này (trong đó file1.txt không trống và file2.txt trống):

$ cat file1.txt >> file2.txt >> file1.txt

Khi tôi thấy nó mất một lúc, tôi nhấn Ctrl+ Cđể kết thúc nó. Đến lúc đó, file1.txt có kích thước hàng trăm MB.

Chuyển đổi tên tệp không tạo ra hiệu ứng tương tự; chỉ khi các tập tin theo thứ tự này mới xảy ra chuyển hướng vô hạn. Chính xác thì chuyện gì đang xảy ra?

Câu trả lời:


24

Bạn không thể yêu catcầu sử dụng nhiều tiêu chuẩn theo cách đó, lần chuyển hướng cuối cùng được ưu tiên như vậy:

cat file1.txt >> file2.txt >> file1.txt

tương đương với:

>> file2.txt ; cat file1.txt >> file1.txt

điều này rõ ràng nhanh chóng lấp đầy hệ thống tệp, vì thực tế tệp nguồn là đích phát triển quá vô hạn được cung cấp file1.txtđủ lớn để không thể đọc cùng một lúc.

Hầu hết các cattriển khai hiện đại nên phát hiện đệ quy và hủy bỏ:

Mèo Solaris:

cat: input/output files 'file1.txt' identical

Mèo gô:

cat: file1.txt: input file is output file

Dù sao họ cũng có thể bị lừa với những thứ như:

cat < file1.txt | cat | cat  >> file2.txt >> file1.txt

Một cách sử dụng tốt đẹp không vô dụng của mèo ...


19
Đó là rất nhiều mèo, meo.
slm

2
Bạn làm đầu óc tôi quay cuồng nhưng bạn đã trả lời câu hỏi của tôi!
Matt

7
Và khi tôi hỏi về điều này trên Google+ (không nhận được câu trả lời), nó sẽ tự động gắn thẻ bài đăng của tôi với #Cat#Caturday
Matt

3

Tôi đã không thể tái tạo điều này trong một vỏ Bash:

# non-empty file1
$ echo 1 > file1.txt

$ cat file1.txt >> file2.txt >> file1.txt 
cat: file1.txt: input file is output file

1 tệp được tạo với độ dài 0 nhưng sau đó tôi nhận được thông báo trên:

$ ls -l
total 4
-rw-rw-r-- 1 saml saml   2 Sep 10 19:35 file1.txt
-rw-rw-r-- 1 saml saml   0 Sep 10 19:35 file2.txt

Dựa trên câu trả lời của @ jlliagre Tôi không chắc tại sao tôi lại nhận được 2 tệp. Nó có thể phụ thuộc vào việc catthực hiện.

EDIT # 1

@jlliagre đã cập nhật câu trả lời của mình để hiển thị mã này mà anh ta tuyên bố là tương đương:

>> file2.txt ; cat file1.txt >> file1.txt

Vì vậy, bây giờ tôi biết tại sao tôi nhận được trống file2.txt. Ký hiệu này là hợp pháp:

>> file2.txt

Và sẽ tạo một tập tin trống.


Hãy thử lại với file1.txtbắt đầu không trống.
Gilles 'SO- ngừng trở nên xấu xa'

@Gilles - Tôi vừa đọc lại và nhận thấy nó, tôi có nên thấy điều gì khác không, tôi vẫn nhận được lỗi chứ? Hay bạn chỉ nói rằng b / c ví dụ trong câu trả lời của tôi là sai? Tôi đã sửa câu trả lời BTW.
slm

@Gilles - đó là downvote của bạn, phải không? Là nó chỉ cho một cái gì đó cụ thể hoặc thiếu giá trị của câu trả lời?
slm

1
Không chắc chắn lý do tại sao câu trả lời của bạn đã được bỏ phiếu, +1 vì đã trải nghiệm trước khi trả lời, điều mà tôi không tự làm ...
jlliagre

+1; cảm ơn bạn đã thử nghiệm Tôi bắt đầu hiểu chuyển hướng và cathành vi tốt hơn.
Matt
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.