有人能向我解释一下使用 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 分叉的任何命令继承。