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的顺序不能反。