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

首先我们来了解一下linux中的文件描述符:

Linux系统将所有设备都当作文件来处理,而Linux用文件描述符来标识每个文件对象。其实我们可以想象我们电脑的显示器和键盘在Linux系统中都被看作是文件,而它们都有相应的文件描述符与之对应。

Linux系统预留可三个文件描述符:0、1和2,他们的意义如下所示:

0——标准输入(stdin)

1——标准输出(stdout)

2——标准错误(stderr)

标准输如(STDIN):

其实我们与计算机之间的交互是我可以输入一些指令之后它给我一些输出。那么我们可以把上面表格中的文件描述符0理解为我和计算机交互时的输入,而这个输入默认是指向键盘的。这个先不多说,先说下标准输出。

标准输出(STDOUT):

文件描述符1理解为我和计算机交互时的输出,而这个输出默认是指向显示器的

实例:假设在当前文件夹中有且只有一个文件laowang.txt,这时我们运行这个命令【ls laowang.txt】,就会获得一个标准输出stdout的输出结果:laowang.txt

root@wangjielin:~# ls laowang.txt
laowang.txt

就像我上面说的那样,既然它们是默认的,我就可以更改它们。下面的命令就是把标准输出的位置改到laowang.txt文件中:

exec > laowang.txt

如果我输入ls -al 或者ps命令,我们的终端将不会显示任何东西。现在,我们可以新开一个终端查看xlinsist这个文件中是否有上面两个命令所显示的内容。注意:你必须新开一个终端。

# 在原先的中断中输入ls laowang.txt两次,终端都没有打印内容。重新开启一个终端查看laowang.txt的内容如下
root@wangjielin:~# cat laowang.txt
laowang.txt
laowang.txt

但是这个指令,只在当前终端适用。当你重新开启一个终端,标准输出任然是打印到终端。

再返回头说下标准输入:

root@wangjielin:~# read user
laowang
root@wangjielin:~# echo $user
laowang

这两句命令的意思是,我们把从键盘输入的laowang读入到user变量。这个read需要我输入。现在,我要改变标准输入的默认位置:

#只是把当前的标准输出重定向到test文件中
root@wangjielin:~# echo 'laowang' >test
root@wangjielin:~# cat test
laowang
#只是把当前的标准输入重定向到test文件中
root@wangjielin:~# read user1 <test
root@wangjielin:~# echo $user1
laowang

标准错误:

标准错误输出和标准输出的区别是,它在命令出错情况下的输出。这没有什么太大的不同,我们也可以把它的输出修改到任何我们想要的位置。只不过我们需要把上面标准输出的1改成2,命令如下:

exec >laowang.txt

这样错误的输出就会重定向到laowang.txt中

比较有趣的是:除了0, 1,2以外,我们可以分配自己的文件描述符。看下面的例子:

root@wangjielin:~# exec >laowang.txt
root@wangjielin:~# echo 'l love the world' >&
root@wangjielin:~# cat laowang
cat: laowang: No such file or directory
root@wangjielin:~# cat laowang.txt
l love the world

上面的命令很有意思:我首先把文件描述符6指向test文件。因为不像描述符1,所有的输出都会自然找它,然后看它是定向到显示器还是某个文件。所以当我们想找描述符6的时候我们要用&来引用它。其实我们可以把文件描述符想像成一个文件的引用,它可以指向任何一个文件(包括显示器),指向的过程就是我们修改默认位置的过程。而用&符号来找到它指向的目标文件,从而向其写入数据。

来测试下,看个复杂点的例子:

exec >&
exec >test
echo "这句话被存到test文件中"
echo "还有这句"
exec >&
echo "这句话输出到显示器"

解题:首先文件描述符1默认指向的是显示器,用&来找到文件描述符1指向的目标文件,也就是显示器。因此文件描述符3也指向了显示器。然后,我们修改了文件描述符1指向的文件到test文件。接着两个echo命令的输出会自然去找文件描述符1,然后它看到文件描述符1指向的是test文件,所以它会把输出写到test文件中。最后,我们用&来找到文件描述符3指向的目标文件,也就是显示器,然后我们修改了文件描述符1指向的文件到显示器。因此,最后一个echo命令会自然的找文件描述符1然后输出到显示器上。

来嘛,进入第二个主题:2>dev/null

学习了上边的内容,对于这个也就不难理解了。就是把标注错误重定向到/dev/null中

值得注意的是:/dev/null是一个特殊的设备文件,这个文件接收到任何数据都会被丢弃。因此,null这个设备通常也被称为位桶(bit bucket)或黑洞。

所以,2>/dev/null的意思就是将标准错误stderr删掉。

最后再推荐一个命令:

tee命令 – 从标准输入读取,写到标准输出和文件。

# 把date产生的输出写到标准输出和文件
date | tee test.txt
# 追加数据
date | tee -a test.txt

liunux中的标准输出。以及常用的 2>dev/null 命令的含义的更多相关文章

  1. shell 中>/dev/null 2>&1含义

    shell中可能经常能看到:>/dev/null 2>&1 命令的结果可以通过%>的形式来定义输出 分解这个组合:“>/dev/null 2>&1” 为五 ...

  2. linux中 /dev/null命令

    /dev/null :代表空设备文件 >  :代表重定向到哪里,例如:echo "123" > /home/123.txt1  :表示stdout标准输出,系统默认值是 ...

  3. linux中Shell标准输出错误 >/dev/null 2>&1 分析【转】

    Shell中可能经常能看到:>/dev/null  2>&1 eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{print ...

  4. Shell标准输出、标准错误 >/dev/null 2>&1

    Shell中可能经常能看到:>/dev/null  2>&1 eg:sudo kill -9 `ps -elf |grep -v grep|grep $1|awk '{print ...

  5. ashx中Response.ContentType的常用类型

    ashx中Response.ContentType的常用类型: text/plaintext/htmltext/xmlapplication/jsonimage/GIFapplication/x-cd ...

  6. DataGridView 中添加CheckBox和常用处理方式 .

    DataGridView 中添加CheckBox和常用处理方式 文章1 转载:http://blog.csdn.net/pinkey1987/article/details/5267934 DataG ...

  7. python基础:os模块中关于文件/目录常用的函数使用方法

    Python是跨平台的语言,也即是说同样的源代码在不同的操作系统不需要修改就可以同样实现 因此Python的作者就倒腾了OS模块这么一个玩意儿出来,有了OS模块,我们不需要关心什么操作系统下使用什么模 ...

  8. shell脚本中的标准输出重定向使用涵义

    0表示标准输入 1表示标准输出 2表示标准错误输出 > 默认为标准输出重定向,与 1> 相同 2>&1 意思是把 标准错误输出 重定向到 标准输出. &>fil ...

  9. [转]Hibernate中property-ref的应用,常用来解决遗留数据库One To Many关系

    [转]Hibernate中property-ref的使用,常用来解决遗留数据库One To Many关系 1.如表Class(ClassID,Class_No,ClassName)与Student(S ...

随机推荐

  1. docker安装centos6

    1,获取Centos镜像>docker pull centos:centos6 2,查看镜像运行情况>docker images centos 3,在容器下运行 shell bash> ...

  2. [Leetcode] 第306题 累加数

    一.题目描述 累加数是一个字符串,组成它的数字可以形成累加序列. 一个有效的累加序列必须至少包含 3 个数.除了最开始的两个数以外,字符串中的其他数都等于它之前两个数相加的和. 给定一个只包含数字 ' ...

  3. Mysql高手系列 - 第14篇:详解事务

    这是Mysql系列第14篇. 环境:mysql5.7.25,cmd命令中进行演示. 开发过程中,会经常用到数据库事务,所以本章非常重要. 本篇内容 什么是事务,它有什么用? 事务的几个特性 事务常见操 ...

  4. Python实战练习_贪吃蛇 (pygame的初次使用)

    正如标题所写的那样,我将一步步的完成本次实战练习——贪吃蛇.废话不多说,感兴趣的伙伴可以一同挑战一下. 首先说明本次实战中我的配备: 开发环境:python 3.7: 开发工具:pycharm2019 ...

  5. mysql replace into使用

    使用mysql插入数据时,我们通常使用的是insert into来处理,replace into有时可以替代insert into功能,但replace into也有自己的用法 准备一张测试表: CR ...

  6. rabbitmq linux卸载

    rabbitmq是运行在erlang环境下的,所以卸载时应将erlang卸载. 1.卸载rabbitmq相关 卸载前先停掉rabbitmq服务,执行命令 $ service rabbitmq-serv ...

  7. CSS div仿table样式

    要想让div元素显示的样式与table相同,那么需要使用display属性,这个属性将告诉浏览器这些数据是制表的,将以哪种样式来渲染数据: // table --使该元素按table样式渲染 // t ...

  8. Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer

    Kafka 学习笔记之 Kafka0.11之console-producer/console-consumer: 启动Zookeeper 启动Kafka0.11 创建一个新的Topic: ./kafk ...

  9. Scala 学习笔记之集合(3)

    建立一个Java类,为了演示Java集合类型向Scala集合的转换: import java.util.ArrayList; import java.util.List; public class S ...

  10. 死磕 java线程系列之自己动手写一个线程池(续)

    (手机横屏看源码更方便) 问题 (1)自己动手写的线程池如何支持带返回值的任务呢? (2)如果任务执行的过程中抛出异常了该怎么处理呢? 简介 上一章我们自己动手写了一个线程池,但是它是不支持带返回值的 ...