Answers:
最重要的区别是,>
使shell打开带有O_WRONLY|O_CREAT|O_TRUNC
标志的文件或类似文件的对象-如果文件存在则将创建或截断该文件,而>>
打开带有O_WRONLY|O_CREAT|O_APPEND
标志的文件-如果存在则将创建或附加该文件。如果您跟踪系统调用,例如使用
$ 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
与
$ 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 +++
请注意,在这两种情况下,打开文件的文件描述符都复制到命令的文件描述符1(stdout)上,并且将由Shell分叉的任何命令继承。