在我们设置定时任务的时候经常会使用标准输出和标准错误输出。这个在Linux是一个非常重要的概念,而且这个很有用。程序应该有数据库的来源端、数据的目的端,以及报告问题的地方,它们被称为标准输入、标准输出以及标准错误输出。

 
程序启动的时候,默认情况下,标准输出、输入都会已经打开,且已准备好供其使用。我们使用Xshell连接并登陆上服务器的时候,默认下终端就是标准输入、输出端。可以试试cat命令。
$ cat                                  #未指定任何的参数是,读取默认的标准输入、写入到默认的标准输出
建华是可以玩耍的小伙伴 #用户输入(此时终端默认是标准输入)
建华是可以玩耍的小伙伴 #程序将内容输出到标准输出(此时终端默认为标准输出)
^D #输入Ctrl-D 告诉程序文件结尾
重定向与管道
Shell提供了数种语法,可以修改默认的IO的来源端和目的端,就是标准输入和输出的地方。
< 修改标准输入 sort < ucid.txt 默认下,标准输入为终端,此时可以更改为你想要的地方
<<   Command << delimiter 从标准输入中读入,直到遇到delimiter分割符
> 修改标准输出 ls -l > listinfo.txt 默认下,标准输出为终端,此时可以修改默认输出的地方。譬如可以将标准输出的内容写在文件中。
如果文件已存在,会被覆盖掉。
>>  输出附件到文件 ls -l >> listinfo.txt 与[>]不一样的是,[>]会清空原来的内容,而[>>]只是将标准输出追加到文件结尾处。
| 建立管道 program1 | program2 1. program1的标准输出为program2的标准输入;
2. 管道的执行效率比使用临时文件的程序起码高一个数量级;
 
[<]例子
场景:对文件内容的信息进行排序
[nemo@name tool]$ cat show.txt

[weiyg@name tool]$ sort < show.txt
[>]例子
场景:打印内容到文件
[weiyg@name script]$ ll
total
-rw-rw-r--. weiyg weiyg Dec : ssh.rb
-rw-r--r--. weiyg weiyg Dec : sshx.rb
-rw-rw-r--. weiyg weiyg Dec : test.rb
[weiyg@name script]$ ls -l > listinfo.txt
[weiyg@name script]$ cat listinfo.txt
total
-rw-rw-r--. weiyg weiyg Jan : listinfo.txt
-rw-rw-r--. weiyg weiyg Dec : ssh.rb
-rw-r--r--. weiyg weiyg Dec : sshx.rb
-rw-rw-r--. weiyg weiyg Dec : test.rb
在定时任务上面经常使用。因为定时任务执行的内容,不会打印到终端。如果需要查看结果的话就很麻烦。而打印到文件中的话,随时都可以查看了。不过这里往往用[>>]追加比较多。
 
[>>]例子
没啥好说的,跟[>]就是一个[>]会覆盖原有的文件,而[>>]只是追加。
 
[|]管道例子
场景:查询id为19217xxxx的玩家在1月15日使用道具的日志
[weiyg@name flash]$ bzcat *useprop.log.--.bz2 |grep '19217xxxx'
|19217xxxx|||||
|19217xxxx|||||

这是查询游戏日志的一个例子。默认下,系统会将游戏5天前的日志进行打包压缩。而此时需要查询5天前的日志的话,使用上面的方法无论在效率上还是方便上,管道都有使用临时文件无法比拟的又是。当然使用下面的方法:

[weiyg@name flash]$ bzcat *useprop.log.--.bz2 > tem.log
[weiyg@name flash]$ grep '19217xxxx' tem.log
|19217xxxx|||||
|19217xxxx|||||
也可以达到相同的结果,但相比使用管道,一、需要使用临时文件,读写在磁盘需要时间;二、临时文件还需要手动删除,比较麻烦。
注:bzcat 可以直接显示压缩文件的内容
 
特殊文件:/dev/null 与/dev/tty
/dev/null  传送到此文件的数据都会被系统丢掉,,就是输出到一个空设备的意思。
/dev/tty   程序打开此文件时,Linux会自动将它重定向到一个终端。
 
文件描述符
在定时任务,我们经常在重定向的时候,喜欢这样操作。
  * * * /home/weiyg/crontab/clear_logs.sh > /dev/null >&
后面的 2>&1是什么意思呢,这里就要理解文件描述符和绑定重定向的概念了。
文件 文件描述符
输入文件——标准输入 0(默认为终端(网上有说默认为键盘的))
输出文件——标准输出 1(默认为终端)
错误输出文件——标准错误 2(默认为终端)
绑定重定向
Commond >&m 标准输出重定向到文件描述符m中
Command <&- 关闭标准输入
Command 0>&- 关闭标准输出
 
此时我们再去理解[2>&1],就容易多了。[2]是标准错误的文件描述符,而[>&1]的意思重定向到标准输出。那么定时任务的解释就是,将[clear_logs.sh]执行的标准输出和标准错误重定向到[/dev/null](就是丢掉输出的内容)。
我是这样理解(不一定正确)上面的定时任务的(分2部分):
clear_logs.sh > /dev/null     #将clear_logs.sh执行的标准输出输出到/dev/null
clear_logs.sh > /dev/null #将clear_logs.sh执行的标准错误输出到/dev/null,只是clear_logs.sh不是执行了2次,只是1次。这里的&1代表的就是/dev/null
 //-----------------------
以上为本次学习I/O重定向的笔记。

参考资料:1. 《Shell脚本学习指南》 Arnold Robbins & Nelson H.F. Beebe著 机械工业出版社
              2. 《Linux shell的标准输入、输出和错误 》 http://blog.csdn.net/cjfeii/article/details/10084343

共勉之

[Linux]基本I/O重定向的更多相关文章

  1. Linux脚本执行过程重定向

    Linux脚本执行过程重定向 一.bash调试脚本,并将执行过程重定向到指定文件 bash –x  shell.sh 2>&1 | tee shell.log

  2. linux 将debug信息重定向到LCD(屏幕)

    /*********************************************************************** * linux 将debug信息重定向到LCD(屏幕) ...

  3. Linux文件查看及重定向

    Linux文件查看及重定向   实验目标: 通过本实验掌握head.tail.cat.more.less等文件查看命令的使用,理解重定向的概念,掌握两种重定向方法的使用. 实验步骤: 1.通过head ...

  4. 46 关于Linux的I/O重定向

    I/O重定向是一个过程,这个过程捕捉一个文件.或命令.或程序.或脚本.甚至代码块(code block)的输出,然后把捕捉到的输出,作为输入发送给另外一个文件.或命令.或程序.或脚本. 1.I/O重定 ...

  5. Linux学习之输入输出重定向

    转自:http://www.cnblogs.com/chengmo/archive/2010/10/20/1855805.html 多谢分享 在了解重定向之前,我们先来看看linux 的文件描述符. ...

  6. (大数据工程师学习路径)第一步 Linux 基础入门----数据流重定向

    介绍 开始对重定向这个概念感到些许陌生,但通过前面的课程中多次见过>或>>操作了,并知道他们分别是将标准输出导向一个文件或追加到一个文件中.这其实就是重定向,将原本输出到标准输出的数 ...

  7. (四)Linux Shell编程——输入输出重定向

    Unix 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示.一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器. 1. 输出重定向 命令的输出不 ...

  8. linux 学习管道 和重定向

    开源文化的理念之一 就是不要重新发明轮子 在linux 系统中大多是都是非常简单的命令,每个命令都是实现一个或者几个简单的功能,我们可以将不同的命令组合在一起 来达到复杂的功能的目的,在linux中因 ...

  9. Linux中将端口(80)重定向

    在Linux中直接指定命令: iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080 其中80为要访问的端 ...

随机推荐

  1. JavaScript日历控件开发 C# 读取 appconfig文件配置数据库连接字符串,和配置文件 List<T>.ForEach 调用异步方法的意外 ef 增加或者更新的习惯思维 asp.net core导入excel 一个二级联动

    JavaScript日历控件开发   概述 在开篇之前,先附上日历的代码地址和演示地址,代码是本文要分析的代码,演示效果是本文要实现的效果代码地址:https://github.com/aspwebc ...

  2. win7怎么快速截取图片

    点击开始--运行或者winkey + r 键直接进入运行. 2 在输入框输入snippingtool,点击确定. 3 这就找到截图工具,如图. END 方法/步骤2   进入c盘--Windows-- ...

  3. C/C++返回内部静态成员的陷阱

    在我们用C/C++开发的过程中,总是有一个问题会给我们带来苦恼.这个问题就是函数内和函数外代码需要通过一块内存来交互(比如,函数返回字符串),这个问题困扰和很多开发人员.如果你的内存是在函数内栈上分配 ...

  4. 一个将java事物的非常好的栗子

    地址:http://www.cnblogs.com/davenkin/archive/2013/02/16/java-tranaction-1.html

  5. 命令行运行python项目文件,报错:ModuleNotFoundError: No module named 'xxxx' 解决办法

    在pycharm中写好了自动化测试脚本,并能在pycharm中正常运行,由于要考虑到无人值守时能自动执行,执行时就需要脱离pycharm,直接能用命令执行.但是直接用命令执行用例文件:python3 ...

  6. Appium 设置手机连接方式

    使用appium的 Connection 和driver 的setConnection方法,可以切换手机的上网方式 // 切换到wifi Connection cnn = Connection.WIF ...

  7. Vue 的开始

    1 框架的 MVVM 模式 ViewModel是Vue.js的核心,它是一个Vue实例.Vue实例是作用于某一个HTML元素上的,这个元素可以是HTML的body元素,也可以是指定了id的某个元素. ...

  8. AD提高动态的方法(附SNR计算)

    作者:桂. 时间:2017-10-10  23:36:40 链接:http://www.cnblogs.com/xingshansi/p/7648475.html 前言 主要分析AD的基本特性,以及动 ...

  9. Atitit jquery  1.4--v1.11  v1.12  v2.0  3.0 的新特性

    Atitit jquery  1.4--v1.11  v1.12  v2.0  3.0 的新特性 1.1. Jquery1.12  jQuery 2.2 和 1.12 新版本发布 - OPEN资讯.h ...

  10. Java集合框架:EnumMap

    EnumMap定义 package java.util; import java.util.Map.Entry; import sun.misc.SharedSecrets; public class ...