shell命令中“>”和“>>”之间的区别是什么?
有人在使用shell命令时向我解释>
和>>
之间的区别吗?
例:
ps -aux > log ps -aux >> log
似乎结果都是相同的。
>
用于写入文件, >>
用于附加到文件。
因此,当您使用ps aux > file
, ps aux > file
的输出将写入file
,如果已存在名为file
,则其内容将被覆盖。
如果你使用ps aux >> file
, ps 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。