本节讨论一下几个问题:

1. 文件描述符。

2. 重定向。

3. 管道符

4. tee的用法。

1. 文件描述符。

在linux系统中一切皆文件。文件夹和设备都是文件。如何用来区别不同的文件呢?这里的区别不是我们在windows下看到的后缀名不同来区别。也不是我们在linux下用ls 命令看到的不同文件的列表。这里的文件描述符主要讨论的是对文件操作的一个标识符。无操作就无标识符。   比如两个进程同时在对同一个文件进行读操作。

如何区分这两个读操作呢?这就需要文件文件描述符来区别了。每一次打开一个文件就形成了一个文件描述符,后打开的描述符一般都要比先打开的文件描述符大。

比如:我们可以man 一下 open函数。 看一下返回值:

  [root@xiaolyu ~]# man open

也就是说文件描述符是一个整数。当然了,系统默认最大是1024. 我们不妨用ulimit -n 来查看一下。

我们也可以查看一下:man socket 一下 看一下效果:

也就是说文件描述符可以通过多种途径来生成。记住:只要对文件进行操作,就会返回文件描述符。

然后我们来看看系统自带的3个文件描述符。

这三个是最小的文件描述符,我们自己操作文件,返回的文件描述符最小都是从4开始的。

stdin   标准输入  默认的设备是键盘    文件描述符为:0

命令将从标准输入文件中   读取   在执行过程中的 需要的  输入数据.  -->数据来源于文件

stdout 标准输出  默认的设备是 显示器  文件描述符为:1

命令执行后的输出结果,发送到标准输出文件.  -->结果输出到文件

stderr 标准错误   默认的设备是显示器  文件描述符为:2

命令将执行期间的各种错误信息发送到标准错误文件 -->错误信息发送到文件

标准输入,标准输出和标准错误默认使用键盘和显示器作为关联设备与操作系统进行交互完成最基本的输入,输出操作.

我们不妨用man stdin 来看一下:[root@xiaolyu ~]# man stdin 

以上便是关于文件描述符。

2. 重定向.

 重定向包含:重定向输出和重定向输入:

 重定向输出:   

    将命令的正常输出结果保存到指定的文件中,而不是直接显示在显示器的屏幕上

    重定向输出使用”>” “>>” 操作符号

   >  覆盖文件

   >> 追加内容

  若重定向的输出的文件不存在,则会新建该文件

eg:  查看当前主机的CPU的类型保存到kernel.txt文件中(而不是直接显示到屏幕上)

    uname -p 查看cpu类型信息 

    

 将内核 的版本信息 和操作系统信息 追加到kernel.txt

    

   重定向输出就将结果输出到文件中(覆盖和追加两种方式)

 

重定向输入 

   将命令中接收输入的途径由默认的键盘改为其他文件.而不是等待从键盘输入

   从文件读取数据

   操作符: “<”

   通过重定向输入可以使一些交互式操作过程能够通过读取文件来完成

  eg:使用passwd 设置密码时.每次都根据提示输入密码比较烦琐

    改用重定向输入将可以忽略交互式的过程.而自动完成密码设置  (结合—stdin 选项来识别标准的输入)

   使用非交互式的去执行设置密码:

  

 

[root@xiaolyu ~]# touch passwd.txt
[root@xiaolyu ~]# vim passwd.txt
[root@xiaolyu ~]# useradd zhangsan
useradd: user 'zhangsan' already exists
[root@xiaolyu ~]# useradd lisi
[root@xiaolyu ~]# passwd --stdin lisi < passwd.txt

Changing password for user lisi.

passwd: all authentication tokens updated successfully.

  重定向输入就是通过文件中的内容作为输入的数据

错误重定向:

   将命令执行过程中出现的错误信息 (选项或参数错误) 保存到指定的文件,而不是直接显示到显示器

   错误信息保存到文件

   操作符: 使用2>

   2指的是错误文件的编号 (在使用标准的输入和输出省略了1 0 编号)

在实际应用中,错误重定向可以用来收集执行的错误信息.为排错提供依据;

 对于shell脚本还可以将无关紧要的错误信息重定向到空文件/dev/null中 以保持脚本输出的简洁

eg: 使用tar命令进行备份的时候出新的错误信息保存到err.log文件中

  

把/dev/null看作"黑洞". 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用.

 

echo $?   表示最近一次操作是否成功 。 0 成功  非零不成功

 正确的写到一个文件,错误的在写到一个文件

[root@xiaolyu ~]#  ls /tmp/ /nginx  1> a.txt 2>b.txt

保存到一张图片比较清爽:

输出到同一个文件中:

[root@xiaolyu ~]#  ls   /tmp/  /nginx/  1>a.txt  2>&1 

或者以下这种写法 ,重定向到文件的1可以省略,因为默认就是1.

[root@xiaolyu ~]#  ls /tmp/ /nginx/ >a.txt 2>&1

&> 混合输出

不分正确的还是错误的

[root@xiaolyu ~]# ls /opt/  /mysql &> a.txt

3. 管道符

  这里只提管道符,关于管道有专门创建管道的函数,以及有名管道和无名管道,以及管道之间的通信,我放在IPC通信中阐述。

管道符,可以把两条命令连起来,前面一条命令的输出当成后面一条命令的输入。

  eg: 查看nginx的进程。

[root@xiaolyu ~]# ps -aux | grep nginx 

  eg: 查看某个进程的端口:

4. tree命令。

功能:读取标准输入的数据,并将其内容输出成文件。
语法:tee [-a][--help][--version][文件...]
tee指令会从标准输入设备读取数据,将其内容输出到标准输出设备,同时保存成文件。
参  数:
 -a或  --append  追加
 --help  在线帮助。
 --version  显示版本信息

eg1

[root@xiaolyu ~]# who   查看用户登录信息

root :0 2016-08-13 07:58 (:0)
root pts/0 2016-08-13 11:21 (:0)

[root@xiaolyu ~]# who | tee who.out

 将who的结果输出到who.out文件 ,同时在终端显示:

 

eg2

[root@xiaolyu ~]# pwd
| tee -a who.out   
追加

要注意的是:在使用管道线时,前一个命令的标准错误输出不会被tee读取。

[root@xiaolyu ~]# ls -l yyy | tee -a who.out 

把标准错误也被tee读取
[root@xiaolyu ~]# ls -l yyy   2>&1 | tee -a who.out
 

linux专题一之文件描述符、重定向、管道符、tee命令的更多相关文章

  1. linux内核中的文件描述符(二)--socket和文件描述符

    http://blog.csdn.net/ce123_zhouwei/article/details/8459730 Linux内核中的文件描述符(二)--socket和文件描述符 Kernel ve ...

  2. [转] linux系统文件流、文件描述符与进程间关系详解

    http://blog.sina.com.cn/s/blog_67b74aea01018ycx.html linux(unix)进程与文件的关系错综复杂,本教程试图详细的阐述这个问题. 包括:     ...

  3. Linux中通过Socket文件描述符寻找连接状态介绍

    针对下文的总结:socket是一种文件描述符 进程的打开文件描述符表 Linux的三个系统调用:open,socket,pipe 返回的都是一个描述符.不同的进程中,他们返回的描述符可以相同.那么,在 ...

  4. linux最大允许的文件描述符open files数nofile修改

    open file resource limit 是linux中process可以打开的文件句柄数量.增加这个数值需要调整两个配置: 第一步, 修改系统最大允许的文件描述符 查看当前的设置: $ ca ...

  5. Linux 进程间传递文件描述符

    文章目录 文件描述符 文件数据结构 共享文件 UNIX域socket实现传递文件描述符 进程间传递打开的文件描述符,并不是传递文件描述符的值.先说一下文件描述符. 文件描述符 对内核来说,所有打开的文 ...

  6. linux shell exec 关联文件描述符

    在写shell脚本时,如果多个命令的输入或输出都是同一个文件,而这个文件的路径和名字都很长,则需要书写很多次同样的路径会很浪费时间,我们可以使用exec命令来关联一个自定义的文件描述符到一个特定的文件 ...

  7. Linux最大文件句柄(文件描述符)限制和修改

    转自:http://jameswxx.iteye.com/blog/2096461 写这个文章是为了以正视听,网上的文章人云亦云到简直令人发指.到底最大文件数被什么限制了?too many open ...

  8. linux修改最大的文件描述符(max file descriptors)

    用xshell登录linux系统之后,用命令>ulimit -a 注意到系统模式是1024个 使用>ulimit -n 数量,可临时更改,生效范围为当前会话 永久修改的方法: > v ...

  9. Linux Shell 文件描述符 及 stdin stdout stderr 重定向

    Abstract: 1) Linux Shell 命令的标准输入.标准输出.标准错误,及其重定位: 2)Linux Shell 操作自定义文件描述符: 文件描述符是与文件相关联的一些整数,他们保持与已 ...

随机推荐

  1. 可嵌入式的动态http服务minihttp组件

    minihttp是基于c#实现的轻量级的动态WEB服务组件,通过minihttp可以轻松地构一个动态的WEB服务并嵌入到.NET程序中运行部署.由于minihttp完全基于托管代码实现,所以可以轻松运 ...

  2. 我的ORM之二--添加

    我的ORM索引 添加的语法: var 影响行数 = dbr.表.Insert(实体).Execute(); 实体类型 1. 任何C#类. 如:public class Entity{   public ...

  3. web.xml详解

    web.xml的作用 web.xml,一个Tomcat工程中最重要的配置文件.web.xml没有其实也可以----只要你确定你的项目里面不需要任何过滤器.监听器.Servlet等等.我试了一下,没有w ...

  4. Spring4:JDBC

    数据库连接池 对一个简单的数据库应用,由于对数据库的访问不是很频繁,这时可以简单地在需要访问数据库时,就新创建一个连接,就完后就关闭它,这样做也不会带来什么性能上的开销.但是对于一个复杂的数据库应用, ...

  5. Java虚拟机6:内存溢出和内存泄露、并行和并发、Minor GC和Full GC、Client模式和Server模式的区别

    前言 之前的文章尤其是讲解GC的时候提到了很多的概念,比如内存溢出和内存泄露.并行与并发.Client模式和Server模式.Minor GC和Full GC,本文详细讲解下这些概念的区别. 内存溢出 ...

  6. Windbg用法详解

    工作空间 WinDBG的工作空间中保存了以下几种信息 调试会话状态: 包括断点,打开的源文件,用户定义的别名(alias)等. 调试器设置:包括符号文件路径,可执行映像文件路径,源文件路径,用I+/I ...

  7. mac 命令行批量删除.svn[转]

    mac下.svn是隐藏文件,而且即使我们调成可见的,一个一个删也很麻烦.今天正好同事问起来这个命令,于是想可能有些人也需要,于是还是放到博客里吧 命令比较简单,其实就是一条linux命令,打开终端,首 ...

  8. [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之摄像机介绍Cameras

    [我给Unity官方视频教程做中文字幕]beginner Graphics – Lessons系列之摄像机介绍Cameras 最近得到一些Unity官方视频教程,一看全是纯英文的讲解,没有任何字幕或者 ...

  9. Vue.js2.0从入门到放弃---入门实例

    最近,vue.js越来越火.在这样的大浪潮下,我也开始进入vue的学习行列中,在网上也搜了很多教程,按着教程来做,也总会出现这样那样的问题(坑啊,由于网上那些教程都是Vue.js 1.x版本的,现在用 ...

  10. WebApi系列~按需序列化字段~Hot

    回到目录 起初只是一个想法,一次讨论,一个设想,但相信一定可以实现,具体的事情是这样的,有个对外的API项目,它为一些终端设备提供数据,如手机,平板,PC,当然你也可以说它为很多平台提供数据win32 ...