linux中>和>>的区别

  '>'  输出到文件中。文件不存在会创建。文件已存在,内容会被覆盖。文件时间会更新。

第一次输入'> test', 第二次输入'> test again', 发现内容

[root@localhost ~]# echo '> test' > echo.log
[root@localhost ~]# ll
总用量 8
-rw-------. 1 root root 1555 8月  20 15:30 anaconda-ks.cfg
-rw-r--r--  1 root root    7 2月   1 18:03 echo.log
[root@localhost ~]# cat echo.log 
> test
[root@localhost ~]# echo '> test again' > echo.log
[root@localhost ~]# cat echo.log 
> test again
[root@localhost ~]# ll
总用量 8
-rw-------. 1 root root 1555 8月  20 15:30 anaconda-ks.cfg
-rw-r--r--  1 root root   13 2月   1 18:04 echo.log

最后输出只有:'> test again' 

删除echo.log, 测试'>>'

'>>'输出到文件中。文件不存在会创建。文件已存在,内容会继续追加在后面。文件时间会更新。

[root@localhost ~]# rm echo.log 
rm:是否删除普通文件 "echo.log"?y
[root@localhost ~]# ll
总用量 4
-rw-------. 1 root root 1555 8月  20 15:30 anaconda-ks.cfg
[root@localhost ~]# echo '> test' >> echo.log
[root@localhost ~]# ll
总用量 8
-rw-------. 1 root root 1555 8月  20 15:30 anaconda-ks.cfg
-rw-r--r--  1 root root    7 2月   1 18:11 echo.log
[root@localhost ~]# cat echo.log 
> test
[root@localhost ~]# echo '> test again' >> echo.log
[root@localhost ~]# ll
总用量 8
-rw-------. 1 root root 1555 8月  20 15:30 anaconda-ks.cfg
-rw-r--r--  1 root root   20 2月   1 18:12 echo.log
[root@localhost ~]# cat echo.log 
> test
> test again
最后输出,文本中有两行。
> test > test again

辅助记忆:
这两个都是重定向,
>> 比较长,只有继续跟在后面附加,文本才会比较长。
> 比较短,理解成替换文本,才不会那么长。


1>> 和 1> 跟 >> 和 > 类似(暂没发现什么区别),都是标准输出(stdout)。以下是测试demo。

[root@localhost ~]# echo 'hello' 1>> echo.log
[root@localhost ~]# ll
总用量 8
-rw-------. 1 root root 1555 8月  20 15:30 anaconda-ks.cfg
-rw-r--r--  1 root root    6 2月   2 17:02 echo.log
[root@localhost ~]# cat echo.log 
hello
[root@localhost ~]# echo 'world' 1>> echo.log
[root@localhost ~]# cat echo.log 
hello
world
[root@localhost ~]# echo 'world' 1> echo.log
[root@localhost ~]# cat echo.log 
world

 2> 和 2>> 这个代表的是标准错误输出(stderr)。

现在用echo肯定看不出结果,因为没有发生错误。

把命令改错,echo --> echoc, 没有echoc这个命令的。

[root@localhost ~]# echoc 'hello' 2>> echo.log
[root@localhost ~]# cat echo.log 
-bash: echoc: 未找到命令
[root@localhost ~]# echoc 'hello' 2>> echo.log
[root@localhost ~]# cat echo.log 
-bash: echoc: 未找到命令
-bash: echoc: 未找到命令
[root@localhost ~]# echoc 'hello' 2> echo.log
[root@localhost ~]# cat echo.log 
-bash: echoc: 未找到命令

可以看出2>是内容覆盖。2>>是错误输出的追加。

 还有一个符号是>&, 这是一个整体。>是代表重定向,&符号,我个人把这个理解成类似于java的那种转义的意思。

2>&1,表示的是把标准错误输出(2表示标准错误输出)定位到标准输出(1表示标准输出)。

如果不加&那就是 2>1, 这个表示的含义是错误输出到名字为1的文件中,1在这边就是表示文件了。所以需要加个&。

例如,这边有一个rocketmq的启动命令

nohup mqnamesrv >/usr/local/log/rocketmqlogs/namesrv.log 2>&1 &  

nohup和最后的&可以先忽略。跟我们讨论关系不大。

 mqnamesrv  >/usr/local/log/rocketmqlogs/namesrv.log  2>&1这个命令中

>/usr/local/log/rocketmqlogs/namesrv.log表示把命令的输出定向到/usr/local/log/rocketmqlogs/namesrv.log

2>&1,表示的是把标准错误输出定位到标准输出。表示错误的也定向到/usr/local/log/rocketmqlogs/namesrv.log

但是>/usr/local/log/rocketmqlogs/namesrv.log和2>&1的顺序不能反。

原文地址:https://www.cnblogs.com/chenmz1995/p/12249399.html