重定向
熟悉几个特殊符号:
< :输入重定向
> :输出重定向
>> :输出重定向,进行追加,不会覆盖之前内容
<< :标准输入来自命令行的一对分隔号的中间内容.
示例:
1.cat >file 记录的是键盘输入,相当于从键盘创建文件,并且只能创建新文件,不能编辑已有文件.>是数据重导向,会将你输入的文本内容输出到file中.
cat >file <
两条命令结合起来使用,既记录了键盘输入内容,同时又规定了结束符号之内的内容的范围
xargs -n 1 < qqq
<<EOF就是告诉shell脚本现在开始执行命令,当遇到EOF的时候结束命令。
!跟命令指上一次的命令
然后是 1>、 2>、 1>>、 2>>的使用,
当我们需要把一个文件正确的输出,和错误的输出分开保存的时候就能用到他们啦。让我用一个简单的python脚本来做一个实验
if __name__ == '__main__':
print 'gogogog'
int('qiowjeioqwjeo')
(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>这样的重定向规则,运行结果会被保存成什么样子呢?
[root@hbl_test houbinglei]# python test.py > log.txt
Traceback (most recent call last):
File "test.py", line 4, in <module>
func()
File "test.py", line 3, in func
int("abc")
ValueError: invalid literal for int() with base 10: 'abc'
[root@hbl_test houbinglei]# cat log.txt
111
那如果我们想让错误和正确的结果都被重定向到同一个文件又应该怎么做呢。
[root@hbl_test houbinglei]# python test.py 1 > log.txt 2>&1
[root@hbl_test houbinglei]# cat log.txt
111
Traceback (most recent call last):
File "test.py", line 4, in <module>
func()
File "test.py", line 3, in func
int("abc")
ValueError: invalid literal for int() with base 10: 'abc'
如果我们想将错误的和正确的信息重定向追加到同一个文件应该怎么做呢?你可能会想到2>>&1。。。然而现实是,并没有这个语法。
然而我们却可以使用1>>pp.txt 2>&1的语法实现这个功能
echo "asd" &>> a.txt &>>就是1跟2 都输入到a.txt
(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'
那么如果我们想保存正确的结果,错误的结果直接丢向垃圾站,既不保存为文件,也不在标准输出打印又该怎么做呢?
(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