shell命令中“>”和“>>”之间的区别是什么?

有人在使用shell命令时向我解释>>>之间的区别吗?

例:

 ps -aux > log ps -aux >> log 

似乎结果都是相同的。

>用于写入文件, >>用于附加到文件。

因此,当您使用ps aux > fileps aux > file的输出将写入file ,如果已存在名为file ,则其内容将被覆盖。

如果你使用ps aux >> fileps aux >> file的输出将被写入file ,如果file已经存在,那么该文件现在将包含其先前的内容以及ps aux的内容。 file内容。

如果你在终端写

 ps aux > log 

它会将ps aux的输出放到日志命名文件中。

然后,如果你把

 ps aux >> log 

然后下一个输出将附加在第一个下面。 如果你只放一个>它会覆盖以前的文件。

是的, >>追加, >总是覆盖/破坏以前的内容。

 ps -aux > log 

是相同的

 rm log 2>/dev/null ps -aux >> log 

在Wintel上, .bat.cmd.ps1脚本也是一样的; 共同的遗产,常识。

最重要的区别是>使用O_WRONLY|O_CREAT|O_TRUNC标志使shell打开文件或类文件对象 – 如果文件存在则将创建或截断文件,而>>使用O_WRONLY|O_CREAT|O_APPEND打开文件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分叉的任何命令inheritance。