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ì?"
Trả lời
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.
Và đó là lý do tại sao Mac được xây dựng trên BSD. –
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
'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
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.
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
Cảm ơn tất cả các câu trả lời của bạn. chúng đều hữu ích. – HelloWorld
- 1. Kết hợp echo và cat trên Unix
- 2. tạo lại lệnh cat Unix bằng Python
- 3. File1 + (File2 - dòng đầu tiên)> File3
- 4. Làm cách nào để triển khai `cat` trong Haskell?
- 5. unix: làm thế nào để mèo từ 2 đầu vào?
- 6. /dev/tty trong UNIX là gì?
- 7. Sử dụng lệnh Unix JOIN để hợp nhất hai tệp
- 8. cat file | ... vs ... <file
- 9. unix/linux internals là gì?
- 10. os.path.abspath ('file1.txt') không trả lại đúng đường dẫn
- 11. shell - cat - hợp nhất nội dung tệp thành một tệp lớn
- 12. Làm thế nào để loại bỏ hàng đầu "./" trong unix "tìm"?
- 13. Padding Rỗng Dòng trong Unix Tham gia hoạt động
- 14. Thực hiện các đường ống trong một vỏ C (Unix)
- 15. tệp thông thường là gì trên unix
- 16. Sự khác nhau giữa $ @ và $ * trong UNIX là gì?
- 17. TTY có nghĩa là gì trong lệnh unix ps?
- 18. Lệnh xuất UNIX UNIX
- 19. Mảng trong vỏ unix?
- 20. Shell scripting: cat vs echo cho đầu ra
- 21. Làm thế nào để thay thế mà không tạo tập tin trung gian trong sed?
- 22. Lệnh Unix FIND trong Groovy
- 23. Unix: Sự khác biệt giữa nguồn và xuất là gì?
- 24. Endianness trong Unix hexdump
- 25. khác biệt giữa grep Vs cat và grep
- 26. Errno :: ENOMEM: Không thể cấp phát bộ nhớ - cat
- 27. sự khác biệt giữa lệnh linux và unix là gì?
- 28. Cách nối các cột của hai tệp trong hệ thống Unix
- 29. Định dạng thời gian UNIX UNIX
- 30. \ 1 trong sed làm gì?
Tôi nghi ngờ đây sẽ là một thử nghiệm rất tốt về hành vi của vỏ. –