2010-10-08 18 views
16

Khi đầu ra của lệnh được chuyển hướng đến một tệp, tệp đầu ra được tạo ra hoặc cắt bớt bởi trình bao trước khi lệnh được thực thi, bất kỳ ý tưởng nào về foo> foo nào?Trong UNIX, "cat file1> file1 làm gì?"

+1

Tôi nghi ngờ đây sẽ là một thử nghiệm rất tốt về hành vi của vỏ. –

Trả lời

17

Trong mọi trường hợp, các tập tin được cắt ngắn. Đó là bởi vì chuyển hướng được xử lý bởi trình bao, mở ra tệp để ghi trước khi gọi lệnh.

cat foo > foo 

Các sẽ cắt cụt vỏ và mở foo để viết, đặt stdout vào tập tin, và sau đó exec của ["cat", "foo"].

GNU mèo thông minh và từ chối tự chuyển hướng tệp. Nó thực hiện điều này bằng cách kiểm tra cặp thiết bị/inode trên các bộ mô tả tệp đầu vào và đầu ra; bạn có thể đọc các chi tiết cấp thấp tuyệt vời ở số src/cat.c. Nó in một tin nhắn và thoát.

Mèo BSD không có sự an toàn như vậy, nhưng vì tệp đã bị cắt bớt, không có gì để đọc, không có gì để viết và nó sẽ dừng lại.


Bạn có thể gia vị mọi thứ lên một chút bằng cách thêm thay vì cắt bớt.

echo hello > foo 
cat foo >> foo 

Bây giờ mọi thứ đều giống nhau ngoại trừ vỏ mở tệp để thêm thay vì cắt bớt tệp.

GNU mèo xem bạn đang làm gì và dừng lại; tệp không bị ảnh hưởng.

Mèo BSD đi vào vòng lặp và tự thêm vào tệp cho đến khi đĩa của bạn đầy.

+0

Và đó là lý do tại sao Mac được xây dựng trên BSD. –

2

Tệp được cắt ngắn trước và sau đó đọc, vì vậy lệnh này sẽ cắt bớt tệp.

Khi tôi cố gắng thực hiện nó, tôi đã cảnh báo này:

mèo: test.txt: tập tin đầu vào là tập tin đầu ra

+0

'Con mèo' của nền tảng nào bạn có? 'cat foo> foo' tạo ra một tệp' foo' trống cho tôi. – birryree

4

On Fedora 13 đây là những gì tôi nhìn thấy

cat foo > foo 
cat: foo: input file is output file 

Nếu foo chứa bất kỳ thứ gì trước đó, nó đã biến mất.

1

Shell sẽ cắt xén, cat dường như kiểm tra một parm đặt tên, nhưng sẽ không kiểm tra chống stdin như dưới đây và luôn thành công:

$ uname -a 
Linux bar 2.6.18-164.15.1.el5PAE #1 SMP Wed Mar 17 12:14:29 EDT 2010 i686 i686 i386 GNU/Linux 
$ dd if=/dev/urandom of=foo bs=1024 count=4 
4+0 records in 
4+0 records out 
4096 bytes (4.1 kB) copied, 0.00334456 seconds, 1.2 MB/s 
$ od -c foo |head -2 
0000000 U 371 003 z 224 334 z K 236 221 k  < c 256 ! 
0000020 % % 256 V \ 005 , 254 X 202 330 004 222 " 037 226 
$ cat <foo >foo && od -c foo 
0000000 
+0

Cảm ơn tất cả các câu trả lời của bạn. chúng đều hữu ích. – HelloWorld

Các vấn đề liên quan