Điều cơ bản bạn cần nắm bắt trong trường hợp này giữa cả hai cách chuyển hướng (> và >>) là:
>
Chuyển hướng và ghi đè thông tin nơi nó được trỏ đến. Điều này xảy ra trong khi nhận được bất kỳ thông tin nào qua đường ống "|"
>>
Chuyển hướng và nối với thông tin mà nó được trỏ đến. Điều này xảy ra trong khi nhận được bất kỳ thông tin nào qua đường ống "|"
Trong cả hai trường hợp nếu tập tin không tồn tại, nó sẽ được tạo thay thế. Chỉ trên ">>" thông tin sẽ được nối nếu bạn chạy lại trên cùng một tệp. Với ">" bạn chỉ cần ghi đè lên mọi thứ bạn đã làm trong lần chạy đầu tiên.
Nhưng đây là thỏa thuận khi sử dụng cùng một tệp đầu vào như tệp đầu ra. Trong trường hợp cụ thể đó, nếu bạn sử dụng ">", bạn sẽ xóa thông tin mà phần "đầu vào" cần phân tích, vì tệp đầu ra sẽ là "ghi đè lên nó". Vì vậy, trong:
rev file.txt | cat > file.txt
Điều thực sự xảy ra trong "giải thích chuyển động chậm" là:
rev
chuẩn bị đảo ngược nội dung file.txt
và gửi nó đến đường ống
- Trong khi
rev
đang gửi thông tin đến đường ống, đường ống truyền trực tiếp đến cat
.
- Trong khi
cat
nhận được thông tin, nó sẽ tự động áp dụng nó cho thông tin file.txt
được đặt.
- Từ khóa ở đây là "while", bởi vì mọi thứ đang diễn ra cùng một lúc. Xin vui lòng xem các ý kiến tuyệt vời dưới đây của Emil để hiểu sâu hơn về phần này.
cat
sẽ không chờ đợi rev
để ống toàn bộ tập tin. Nó chỉ đơn giản là bắt đầu ngay khi phần đầu tiên của thông tin được gửi đến, điều đó có nghĩa, tùy thuộc vào biểu tượng bạn đã sử dụng, nó sẽ mở ra một kết nối file.txt
.
- Trong trường hợp này vì bạn đã sử dụng > thay vì >> , trình bao sẽ cắt bớt tệp đầu ra, điều đó có nghĩa là nó sẽ mở và xóa thông tin
file.txt
trong khi chờ thông tin mới đến. Với >> nó sẽ mở một kết nối với file.txt
và chờ thông tin mới trên dòng cuối cùng được phát hiện.
- Kể từ khi thông tin đã được xóa trong
file.txt
với > , rev
sẽ cố gắng để làm điều đó của công việc và nhận được gì vì cat
tất cả mọi thứ bị xóa để chuẩn bị cho những thông tin mới.
Vậy tại sao những người khác làm việc sau khi đọc những điều trên. Vì điều này:
rev file.txt | cat > file2.txt && mv file.txt file2.txt
Ở đây bạn đang dẫn đến con mèo đang gửi thông tin đến một tập tin khác . Trong trường hợp này, tệp đầu vào được xử lý file.txt
không giống với tệp đầu ra file2.txt
. Sau đó bạn đang theo nghĩa đen ghi đè lên toàn bộ file2.txt
với file.txt
, vì vậy tất cả các quá trình được thực hiện bởi cat
đã bị xóa. Về cơ bản, toàn bộ dòng có thể được đơn giản hóa như thế cp file.txt file2.txt
bởi vì nó đang làm điều tương tự vì file2.txt
cuối cùng nó mất rev
và được ghi đè bằng mv
lệnh.
rev file.txt | cat >> file.txt
Trong trường hợp này, bạn đang nối thông tin vào cùng một tệp. Vì vậy, nó chỉ mở một kết nối đến tập tin đó nhưng không xóa thông tin như đã thấy với một > . Kết quả cuối cùng phải là, thông tin gốc cộng với thông tin đảo ngược.
cat
đi như thế này :rev file.txt > file2.txt && mv file2.txt file.txt
. Đây là một sử dụng thừacat
. Bằng cách để nó ra, bạn dự phòng thêm một quá trình.