Câu trả lời:
>
được sử dụng để ghi đè ( tập tin clobber ) một tập tin và >>
được sử dụng để nối vào tập tin.
Do đó, khi bạn sử dụng ps aux > file
, đầu ra của ps aux
sẽ được ghi vào file
và nếu một tệp có tên file
đã có sẵn, nội dung của nó sẽ bị ghi đè.
Và nếu bạn sử dụng ps aux >> file
, đầu ra của ps aux
sẽ được ghi vào file
và nếu tệp có tên file
đã có sẵn, thì tệp sẽ chứa nội dung trước đó và cả nội dung của ps aux
, được viết sau nội dung cũ hơn của nó file
.
Sự khác biệt quan trọng nhất là >
làm cho shell mở một tệp hoặc đối tượng giống như tệp có O_WRONLY|O_CREAT|O_TRUNC
cờ - tệp sẽ được tạo hoặc cắt bớt nếu nó tồn tại, trong khi >>
mở tệp có O_WRONLY|O_CREAT|O_APPEND
cờ - tệp sẽ được tạo hoặc gắn vào nếu nó tồn tại. Điều này là hiển nhiên nếu bạn theo dõi các cuộc gọi hệ thống, ví dụ như với
$ strace -e open,dup2 bash -c 'true >> /dev/null'
...
open("/dev/null", O_WRONLY|O_CREAT|O_APPEND, 0666) = 3
dup2(3, 1) = 1
dup2(10, 1) = 1
Và với
$ strace -e open,dup2 bash -c 'true > /dev/null'
...
open("/dev/null", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 3
dup2(3, 1) = 1
dup2(10, 1) = 1
+++ exited with 0 +++
Lưu ý rằng trong cả hai trường hợp, bộ mô tả tệp của tệp đang mở được sao chép vào bộ mô tả tệp 1 (stdout) của lệnh và điều đó sẽ được kế thừa bởi bất kỳ lệnh nào mà shell forks.