本节讨论一下几个问题:

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. openSUSE 11 上的配置可以Xmanager远程桌面

    openSUSE 11 上的配置(适用于默认图形环境为KDE的Linux): 1.配置KDM. openSUSE 11的默认图形环境为KDE,虽然可以同时安装GDM和KDM,但默认只启动了KDM.所以 ...

  2. Linux及文件系统基本介绍

    Linux及文件系统基本介绍 1   互联网行业现状 在服务器端市场: 超级计算机 2014年11月的数据显示前500系统中的485个系统都在运行着 Linux 的发布系统,而仅仅只有一台运行着 Wi ...

  3. Windows Azure Service Bus Notification Hub推送通知

    前言 随着Windows Azure 在中国的正式落地,相信越来越多的人会体验到Windows Azure带来的强大和便利.在上一篇文章中, 我们介绍了如何利用Windows Azure中的Servi ...

  4. Google 新推出Background sync API

    Background sync是Google新推出的Web API,可延迟用户行为,直到用户网络连接稳定.这样有助于保证用户想要发送的数据就是实际发送的数据. 目前存在的问题 网络是消磨用户时间最多的 ...

  5. P,NP,NP_hard,NP_complete问题定义

    背景:在看李航的<统计学习方法时>提到了NP完全问题,于是摆之. 问题解答:以下是让我豁然开朗的解答的摘抄: 最简单的解释:P:算起来很快的问题NP:算起来不一定快,但对于任何答案我们都可 ...

  6. 大叔也说Xamarin~Android篇~监听返回键,单击返回某个webView,双击退出

    回到目录 这个操作在原生android里是很容易实现的,在xamarin里也不难,在activity里有方法OnKeyDown,我们只需要重写一下就可以了,然后通过webView重新加载到要返回的页面 ...

  7. Memcache基础教程

    Memcache是什么 Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力. 它可以应 ...

  8. 静态(static)代码块、构造代码块、构造函数、父类子类执行顺序

    静态代码块:static修饰的代码块. 在类加载-初始化的时候进行,主要目的是给变量赋予初始值 构造代码块:直接在类中定义且没有加static关键字的代码块称为构造代码块. java会把构造代码块放到 ...

  9. Liferay7 BPM门户开发之41: Expando API入门

    Expando 是liferay的一种自定义表格扩展的方式,从5.0就已存在 , 可以在运行时新建表格\字段\行\值. 这是一种Service Builder之外的轻量级替代扩展方式,不必像Servi ...

  10. Struts2--ONGL--值栈

    ONGL:用来访问栈里对象属性的语言,通常由Struts标签来解析, 注意:要在接续OGNL的页面加入<%@ taglib prefix="s" uri="/str ...