重定向命令其实用得不少吧,只是重来都没有仔细看过,这波正好又用到 又有空总结一波。
先看>和>>:
他们俩其实唯一的区别就是>是重定向到一个文件,>>是追加内容到文件。两个命令都是如果文件不存在则创建文件。举个例子来看看:
(thrift_rpc)piperck➜ Desktop ᐅ ll >> 123.txt (thrift_rpc)piperck➜ Desktop ᐅ ll | grep 123.txt -rw-r--r-- 1 piperck staff 2.8K Dec 25 00:24 123.txt
可以看到可以将ll的输出 重定向到123.txt中, >也是同样的效果。只是如果使用>执行重定向的位置没有这个文件
(thrift_rpc)piperck➜ Desktop ᐅ ls > /poweqpikp/123 zsh: no such file or directory: /poweqpikp/123 (thrift_rpc)piperck➜ Desktop ᐅ ls >> /poweqpikp/123 zsh: no such file or directory: /poweqpikp/123 (thrift_rpc)piperck➜ Desktop ᐅ ls > 123 (thrift_rpc)piperck➜ Desktop ᐅ ls >> 1234
但是如果你重定向的是没有的文件夹里面的文件,那么文件夹他是不会帮你创建的,所以会报出错误,这点要注意。
然后是 1>、 2>、 1>>、 2>>的使用,
当我们需要把一个文件正确的输出,和错误的输出分开保存的时候就能用到他们啦。让我用一个简单的python脚本来做一个实验
python脚本如下
# coding: utf-8 if __name__ == '__main__': print 'gogogog' int('qiowjeioqwjeo')
该脚本会正确执打印gogogog 然后 报出下面强转的错误。
(thrift_rpc)piperck➜ py_pra ᐅ python pp.py 1> right.txt 2> wrong.txt (thrift_rpc)piperck➜ py_pra ᐅ ls NS8A_client gevent pp.py starcraft2 baidu_phoneassist laplace_pra right.txt wrong.txt (thrift_rpc)piperck➜ py_pra ᐅ cat right.txt gogogog (thrift_rpc)piperck➜ py_pra ᐅ cat wrong.txt Traceback (most recent call last): File "pp.py", line 6, in <module> int('qiowjeioqwjeo') ValueError: invalid literal for int() with base 10: 'qiowjeioqwjeo'
可以看到,正确的输出被保存进了right.txt 而错误的输出被重定向到了wrong.txt 。
那么如果我们不区分1>2>这样的重定向规则,运行结果会被保存成什么样子呢?
(thrift_rpc)piperck➜ py_pra ᐅ python pp.py > pp.txt Traceback (most recent call last): File "pp.py", line 6, in <module> int('qiowjeioqwjeo') ValueError: invalid literal for int() with base 10: 'qiowjeioqwjeo' (thrift_rpc)piperck➜ py_pra ᐅ cat pp.txt gogogog
可以看到只保存了正确的结果,错误的信息被打印到标准输出上面。
那如果我们想让错误和正确的结果都被重定向到同一个文件又应该怎么做呢。
(thrift_rpc)piperck➜ py_pra ᐅ python pp.py 1> ppp.txt 2>&1 (thrift_rpc)piperck➜ py_pra ᐅ cat ppp.txt gogogog Traceback (most recent call last): File "pp.py", line 6, in <module> int('qiowjeioqwjeo') ValueError: invalid literal for int() with base 10: 'qiowjeioqwjeo'
可以看到,我们将错误也重定向到和1相同的文件 就实现了这个需求。
同理1>> 2>>其实也就是追加数据到文件中,和前面介绍的> >>没有什么不同,需要提到的一点是,如果我们想将错误的和正确的信息重定向追加到同一个文件应该怎么做呢?你可能会想到2>>&1。。。然而现实是,并没有这个语法。
然而我们却可以使用1>>pp.txt 2>&1的语法实现这个功能
(thrift_rpc)piperck➜ py_pra ᐅ python pp.py 1>> pp.txt 2>&1 (thrift_rpc)piperck➜ py_pra ᐅ cat pp.txt gogogog gogogog Traceback (most recent call last): File "pp.py", line 6, in <module> int('qiowjeioqwjeo') ValueError: invalid literal for int() with base 10: 'qiowjeioqwjeo' gogogog Traceback (most recent call last): File "pp.py", line 6, in <module> int('qiowjeioqwjeo') ValueError: invalid literal for int() with base 10: 'qiowjeioqwjeo'
可见看似1> 1>> 2> 2>>是相一一对应的,但是其实不是,他们可以混用,比方说正确的结果想追加,错误的结果我想覆盖。
(thrift_rpc)piperck➜ py_pra ᐅ python pp.py 1>>right.txt 2>wrong.txt (thrift_rpc)piperck➜ py_pra ᐅ cat right.txt gogogog (thrift_rpc)piperck➜ py_pra ᐅ cat wrong.txt Traceback (most recent call last): File "pp.py", line 6, in <module> int('qiowjeioqwjeo') ValueError: invalid literal for int() with base 10: 'qiowjeioqwjeo' (thrift_rpc)piperck➜ py_pra ᐅ python pp.py 1>>right.txt 2>wrong.txt (thrift_rpc)piperck➜ py_pra ᐅ cat right.txt gogogog gogogog (thrift_rpc)piperck➜ py_pra ᐅ cat wrong.txt Traceback (most recent call last): File "pp.py", line 6, in <module> int('qiowjeioqwjeo') ValueError: invalid literal for int() with base 10: 'qiowjeioqwjeo'
类似这种组合混用的情况,相对来说也不少见。也可以看出重定向标识的灵活性。
那么如果我们想保存正确的结果,错误的结果直接丢向垃圾站,既不保存为文件,也不在标准输出打印又该怎么做呢?
(thrift_rpc)piperck➜ py_pra ᐅ python pp.py 1>>right.txt 2>/dev/null
(thrift_rpc)piperck➜ py_pra ᐅ cat right.txt
gogogog
gogogog
gogogog
直接将错误输出重定向到/dev/null 就好了,他就像一个无底洞,丢进去的东西就不见了。
那么<又是什么意思呢?<可以将原本由标准输入改为由指定地方输入举个例子就明白了:
(thrift_rpc)piperck➜ py_pra ᐅ vi hh (thrift_rpc)piperck➜ py_pra ᐅ >> txt.py < hh (thrift_rpc)piperck➜ py_pra ᐅ cat txt.py qwejqwoijeoq
灵活使用重定向标识符 将极大方便我们日常对系统的操作,和灵活控制脚本的运作,所以一定要掌握哟!
Reference:
http://blog.chinaunix.net/uid-298599-id-2443108.html Linux - 命令重定向