linux命令重定向>、>>、 1>、 2>、 1>>、 2>>、 <

重定向命令其实用得不少吧,只是重来都没有仔细看过,这波正好又用到 又有空总结一波。

先看>和>>:

他们俩其实唯一的区别就是>是重定向到一个文件,>>是追加内容到文件。两个命令都是如果文件不存在则创建文件。举个例子来看看:

(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 - 命令重定向

posted @   piperck  阅读(55890)  评论(0编辑  收藏  举报
编辑推荐:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
· C++代码改造为UTF-8编码问题的总结
· DeepSeek 解答了困扰我五年的技术问题
阅读排行:
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· 清华大学推出第四讲使用 DeepSeek + DeepResearch 让科研像聊天一样简单!
· 实操Deepseek接入个人知识库
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· 易语言 —— 开山篇
历史上的今天:
2015-12-25 关于适用base64对图片进行编码在服务器上性能的相关讨论
2015-12-25 关于python requests 包跑ssl的设置 和 charles相关抓包的问题
点击右上角即可分享
微信分享提示