出于特殊目的,bash shell保留了最早的3个文件描述符0、1、2,如下所示:

1、STDIN标准输入

Shell从STDIN文件描述对应的键盘获得输入,在用户输入时处理每个字符。

范例1cat命令处理STDIN输入的数据,输入一个就显示一个,按ctrl+c即可结束。

[root@cloucentos6 home]# cat

my

my

name

name

is

is

TOM

TOM

范例2使用输入重定向符号 < 时,Linux会重写向指定的文件来替换文字的输入文件描述符。

[root@cloucentos6 home]# cat file

my name is Tom.

[root@cloucentos6 home]# cat < file

my name is Tom.

2、STDOUT标准输出

shell所有的输出(包括shell中运行的程序和脚本)会被定向到标准输出中,就是在终端上显示出来。

范例1使用输出重定向 > 来改变输出。

[root@cloucentos6 home]# ls -l > file

[root@cloucentos6 home]# cat file

总用量 20

-rw-r--r--. 1 root root     0  6月 24 07:37 file

drwx------. 2 root root 16384 12月 21 2016 lost+found

-rwx------. 1 root root    81  6月 23 23:32 test.sh

范例2使用输出重写向 >> 可以追加某个文件。

[root@cloucentos6 home]# ls -l >> file

[root@cloucentos6 home]# cat file

总用量 20

-rw-r--r--. 1 root root     0  6月 24 07:37 file

drwx------. 2 root root 16384 12月 21 2016 lost+found

-rwx------. 1 root root    81  6月 23 23:32 test.sh

总用量 24

-rw-r--r--. 1 root root   171  6月 24 07:37 file

drwx------. 2 root root 16384 12月 21 2016 lost+found

-rwx------. 1 root root    81  6月 23 23:32 test.sh

3、STDERR标准错误

shell运行程序和脚本出错时生成的错误消息都会发送到这个位置。

范例1只重定向错误,STERR文件描述符被设成2,ls 查看一个/home目录不存在的文件将错误输出到file文件,屏幕上不会显示错误。

[root@cloucentos6 home]# ls  -l  test4  2>file  

[root@cloucentos6 home]# cat file

ls: 无法访问test4: 没有那个文件或目录

范例2重写向错误和数据,如果想重写向错误和正常输出,必须用两个重写向符号。STDOUT文件描述符被设为1,STERR文件描述符被设成2。

[root@cloucentos6 home]# ls

lost+found  test.sh

[root@cloucentos6 home]# ls -l test.sh test4 2>file1 1>file2

[root@cloucentos6 home]# ls

file1  file2  lost+found  test.sh

[root@cloucentos6 home]# cat file1

ls: 无法访问test4: 没有那个文件或目录

[root@cloucentos6 home]# cat file2

-rwx------. 1 root root 81  6月 23 23:32 test.sh

范例3假如把STDERR和STDOUT输出重定向到同一个文件file中,bash shell提供了一个特殊的重定向符号 &>

[root@cloucentos6 home]# ls

lost+found  test.sh

[root@cloucentos6 home]# ls -l test.sh test2 &>file

[root@cloucentos6 home]# cat file

ls: 无法访问test2: 没有那个文件或目录

-rwx------. 1 root root 81  6月 23 23:32 test.sh

4、在脚本中重写向输出

范例1在脚本中临时指定某行重定向输出标准错误和标准

[root@cloucentos6 home]# cat test.sh

#!/bin/bash

bit=`arch`

echo "hello ! world~!"

echo "系统位数 $bit" >&2

ipocnfig >&2

[root@cloucentos6 home]# ./test.sh 2>out

hello ! world~!

[root@cloucentos6 home]# cat out

系统位数 x86_64

./test.sh: line 5: ipocnfig: command not found

范例2永久重定向输出脚本中所有标准错误

[root@cloucentos6 home]# cat test.sh

#!/bin/bash

exec 2>/home/out

bit=`arch`

echo "hello ! world~!"

echo "系统位数 $bit"

ipocnfig

[root@cloucentos6 home]# ./test.sh

hello ! world~!

系统位数 x86_64

[root@cloucentos6 home]# cat out

./test.sh: line 7: ipocnfig: command not found

范例3永久重定向输出脚本中所有标准错误和标准输出

[root@cloucentos6 home]# cat test.sh

#!/bin/bash

exec &>/home/out

bit=`arch`

echo "hello ! world~!"

echo "系统位数 $bit"

ipocnfig

[root@cloucentos6 home]# ./test.sh

[root@cloucentos6 home]# cat out

hello ! world~!

系统位数 x86_64

./test.sh: line 7: ipocnfig: command not found

5、阻止命令输出

如果你想shell脚本后台运行输出所有的信息都要丢掉,不想显示出来,可以把Shell重定向到一个称作null文件的特殊文件,只要输出到null文件的任何数据都不会保存,这样所有的输出都会被丢掉。

范例1Linux系统上的null文件的标准位置是/dev/null,你重定向到该位置的任何数据都会被丢掉,不会显示:

[root@cloucentos6 home]# ls -l > /dev/null

[root@cloucentos6 home]# cat /dev/null

范例2阻止任何错误消息而不保存它们的一个通用方法

[root@cloucentos6 home]# ls -al test4.txt test.sh 2>/dev/null

-rwx------. 1 root root 98  6月 26 19:09 test.sh

范例3由于/dev/null文件不含有任何内容,重定向输入将/dev/null作为输入文件,可以使用它快速清空现有文件中的所有数据,不用先删除文件再创建。

[root@cloucentos6 home]# cat out

hello ! world~!

[root@cloucentos6 home]# cat /dev/null > /home/out

[root@cloucentos6 home]# cat out

6、记录消息

tee命令相当于管道的一个T型接头,可以从标准输入过来的数据同时发给两个上的地。一个目的地是标准输出,另一个目的地是tee命令行所指定的文件名。

范例1tee将从STDIN过来的数据重定向。

[root@cloucentos6 home]# date | tee out

2017年 06月 27日 星期二 00:18:28 CST

[root@cloucentos6 home]# cat out

2017年 06月 27日 星期二 00:18:28 CST

范例2默认情况下,tee命令会在每次使用时覆盖输出文件,如果想将数据追加到文件中,必须使用 – a  选项。

[root@cloucentos6 home]# cat out

2017年 06月 27日 星期二 00:18:28 CST

root@cloucentos6 home]# who | tee -a out

root     pts/0        2017-06-27 00:14 (10.8.9.11)

[root@cloucentos6 home]# cat out

2017年 06月 27日 星期二 00:18:28 CST

root     pts/0        2017-06-27 00:14 (10.8.9.11)

[root@cloucentos6 home]# arch | tee out

x86_64

[root@cloucentos6 home]# cat out

x86_64

范例3脚本中把数据保存到文件中,也能把数据显示在屏幕上(但tee命令输出的错误信息不会保存在文件中)。

[root@cloucentos6 home]# cat test.sh

#!/bin/bash

bit=`arch`

echo "hello ! world~!" | tee out

echo "系统位数 $bit" | tee -a out

ipocnfig | tee -a out

[root@cloucentos6 home]# ./test.sh

hello ! world~!

系统位数 x86_64

./test.sh: line 5: ipocnfig: command not found

[root@cloucentos6 home]# cat out

hello ! world~!

系统位数 x86_64

Linux 标准文件描述符的更多相关文章

  1. Linux 文件描述符详解

    Overview 了解Linux怎样处理输入和输出是非常重要的.一旦我们了解其原理以后,我们就可以正确熟练地使用脚本把内容输出到正确的位置.同样我们也可以更好地理解输入重定向和输出重定向. Linux ...

  2. Linux文件描述符与打开文件之间的区别(转载)

    转载请说明出处:http://blog.csdn.net/cywosp/article/details/38965239   1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为: ...

  3. linux文件描述符--转载

    转自:http://blog.csdn.net/cywosp/article/details/38965239 1. 概述     在Linux系统中一切皆可以看成是文件,文件又可分为:普通文件.目录 ...

  4. 玩转Linux文件描述符和重定向

    本文介绍linux中文件描述符与重定向的相关知识,文件描述符是与文件输入.输出相关联的整数,它们用来跟踪已打开的文件.有需要的朋友参考下. 原文出处:http://www.jbxue.com/arti ...

  5. [转帖]linux文件描述符文件/etc/security/limits.conf

    linux文件描述符文件/etc/security/limits.conf https://blog.csdn.net/fanren224/article/details/79971359 需要多学习 ...

  6. [fw]LINUX中断描述符初始化

    LINUX中断描述符初始化 @CopyLeft by ICANTH,I Can do ANy THing that I CAN THink!~ Author: WenHui, WuHan Univer ...

  7. linux文件描述符、软硬连接、输入输出重定向

    引用链接:https://blog.csdn.net/qq769651718/article/details/79459346 文件描述符的作用: 文件描述符是linux操作系统中特有的概念.其相当于 ...

  8. [性能分析]linux文件描述符(转)

    1.什么是文件和文件描述符 Linux中文件可以分为4种:普通文件.目录文件.链接文件和设备文件.1.普通文件是用户日常使用最多的文件,包括文本文件.shell脚本.二进制的可执行和各种类型的数据.l ...

  9. linux 文件描述符

    文件描述符是什么?和文件句柄有啥区别?文件描述符是linux/unix操作系统中特有的概念.相当于windows系统中的文件句柄.一个意思不同叫法.Linux系统中, 每当进程打开一个文件时,系统就为 ...

随机推荐

  1. 【MyBean调试笔记】关于单元的释放顺序

    [概述] DEMO提交人:惠商软件  2508696439 问题描述:MDIConsole, DEMO如果Forms单元引用顺序放在mybean.console.pas文件之后如下图所示时: 创建同一 ...

  2. 转css中文英文换行、禁止换行、显示省略号

    css中文英文换行.禁止换行.显示省略号 原创 2016年08月09日 14:20:01   word-break:break-all;只对英文起作用,以字母作为换行依据 word-wrap:brea ...

  3. 【转】Mysql千万级数据表结构修改

    当需要对表进行ddl操作如加索引.增删列时,数据量小时直接在线修改表结构影响不大当表达到百万.千万数据就不能直接在线修改表结构 下面是具体的过程:1.备份数据select * from ih_orde ...

  4. Python(二)之对象类型

    本篇记录Python对象类型 开始仍然是先掌握几个查看对象有用的函数,id,type,print 查看对象身份.类型.值:记住以下两个命令id,type 两个对象的比较 以上三个分别是 身份比较.对象 ...

  5. Oracle数据库密码过期

    按照如下步骤进行操作:1.查看用户的proifle是哪个,一般是default: SQL>SELECT USERNAME,PROFILE FROM DBA_USERS; 2.查看指定概要文件(如 ...

  6. Eigen教程(8)

    整理下Eigen库的教程,参考:http://eigen.tuxfamily.org/dox/index.html 原生缓存的接口:Map类 这篇将解释Eigen如何与原生raw C/C++ 数组混合 ...

  7. tomcat7.0 windows部署使用80端口问题

    如果安装有.net的IDE,那么80端口容易被IIS内的站点占用,如果不是则手动查找. 1:在命令行中输入netstat -ano,得到端口号对应的PID pid这么来显示

  8. EF实现主从表自动生成主键保存

    Class cl = new Class() { ClassName = "一年级1班" }; TestDBEntities context = new TestDBEntitie ...

  9. 【转】 oracle 层次查询判断叶子和根节点

    Oracle 9i判断是叶子或根节点,是比较麻烦的一件事情,SQL演示脚本如下: DROP TABLE idb_hierarchical; create TABLE idb_hierarchical ...

  10. quartz定时任务框架的使用以及原理

    quartz定时任务时间设置 这些星号由左到右按顺序代表 :     *    *     *     *    *     *   *                                 ...