shell 命令中“>”和“>>”有什么区别?

shell 命令中“>”和“>>”有什么区别?

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

例子:

ps -aux > log
ps -aux >> log

看起来无论哪种方式结果都是一样的。

答案1

>用于覆盖(“破坏”)文件,>>用于将内容追加到文件。

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

并且如果使用ps aux >> file,则 的输出ps aux将被写入file,并且如果名为 的文件file已经存在,则该文件现在将包含其先前的内容以及 的内容ps aux,该内容写入其先前的 内容之后file

答案2

如果你在终端中写入

ps aux > log

它会将输出存入ps aux名为 log 的文件中。

那么如果你把

ps aux >> log

那么下一个输出将附加在第一个输出下方。如果只放一个,>它将覆盖前一个文件。

答案3

是的,>>附加,>总是覆盖/销毁以前的内容。

ps -aux > log

是相同的

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

.bat在 Wintel 上,.cmd也是如此,.ps1脚本也是如此;共同的遗产,共同的意识。

答案4

最重要的区别是,>使用标志打开文件或类似文件的对象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 分叉的任何命令继承。

相关内容