问题描述
有人可以使用shell命令向我解释>
和>>
之间的区别吗?
例:
ps -aux > log
ps -aux >> log
似乎结果是相同的。
最佳答案
>
用于覆盖文件(“ clobber”),而>>
用于附加文件。
因此,当您使用ps aux > file
时,ps aux
的输出将被写入file
,并且如果已经存在名为file
的文件,则其内容将被覆盖。
如果您使用ps aux>> file,则将ps aux的输出写入文件,如果已经存在名为file的文件,则该文件现在将包含其以前的内容以及在文件的较早内容之后写入的ps aux的内容。
次佳答案
如果您在终端中写
ps aux > log
它将ps aux
的输出记录到命名文件中。
那如果你把
ps aux >> log
那么下一个输出将附加在第一个输出之后。如果仅放置一个>
,它将覆盖先前的文件。
第三种答案
是的,>>
会附加,>
会始终覆盖/销毁先前的内容。
ps -aux > log
是相同的
rm log 2>/dev/null
ps -aux >> log
在Wintel上,.bat
,.cmd
和.ps1
脚本也是如此;共同的遗产,常识。
第四种答案
最重要的区别是>
使 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分叉的任何命令继承。