先用简单的语言回答题主的问题:

shell程序中 2> /dev/null 代表什么意思?

答:“2> /dev/null” 代表忽略掉错误提示信息。

如题 2> 代表什么意思?讲错误输出删除?

答:“2>” 代表重定向操作错误提示信息。只有这两个字符并不能删除错误输出。

如果有正确的输出并赋值给i,i会得到正确的值吗?

答:i会得到正确的值。

上面的三个回答是我认为相对比较友好,容易理解的回答。

---------------------------------------我是啰哩啰唆回答的分割线-------------------------------------

2016-12-12 更新错误描述与更新排版

下面,咱们一起来看看这个命令操作涉及到的知识点(敲黑板。。。。)题主问题里描述的这条命令其实涉及到三部分的内容,如下图:

(原谅我奇怪的画风……)

下面的所有回到都是假设大家对linux没有太多的了解所作的,如有高手,打脸的时候请轻一点。+_+

1. 文件描述符

下面手打一段《linux shell脚本攻略》的描述(如有侵权我会删除的 T_T):

文件描述符是与文件输入、输出关联的整数。它们用来跟踪已打开的文件。最常见的文件描述符是stidin、stdout、和stderr。我们可以将某个文件描述符的内容重定向到另外一个文件描述符中。

《linux shell脚本攻略》

文件描述符我们常见的就是系统预留的0,1和2这三个,他们的意义分别有如下对应关系:

0 —— stdin(标准输入)

1 —— stdout (标准输出)

2 —— stderr (标准错误)

其中,shell编程里经常用到的就是描述符1,和描述符2。这样下面我们来举两个栗子,就知道神马是1和2了:

1 —— stdout

假设:在当前目录下我们“有且只有”一个文件名为 123.txt 的文本文件。这个时候我们运行下面的命令【ls 123.txt】:

我们就会获得一个标准输出stdout的输出结果“123.txt” 。

2 —— stderr

按照上面同样的假设,我们运行另外一跳命令【ls abc.txt】:

我们就会获得一个标准错误stderr的输出结果“ls:无法访问abc.txt:没有那个文件或目录”。

有同学应该会觉得,这两个事例好像跟1和2这两个阿拉伯数字好像没有关系。这个就要结合第二个知识点“重定向操作”来理解了。

2.重定向操作

书里找不到准确的关于重定向的描述,我很不要脸滴来说一下我的理解吧。重定向操作,其实就是通过在shell命令后面追加一个重定向操作符号,将shell命令对应的文件描述符输出的文本信息重新输入到另外一个指定文件的操作。

重定向操作符号有两个>和>>。尽管这两个操作符都可以将重定向到文件,但是前者会先清空文件,再写入内容;后者会将内容追加到现有文件的尾部。(对了,重定向的操作制定的文件如果原来不存在的话,重定向的操作会主动创建这个文件名的文件的)

下面我们结合第1个知识点文件描述符来举栗子吧。

重定向标准输出stdout

如上图所示,对比没有添加重定向的操作,ls命令在使用之后并没有将字符“123.txt”这个字符串打印到屏幕上。在紧接着的cat操作之后,我们可以看到本来应该输出字符串被记录在了stdout.txt这个文件里面了。

其实,对于标准输出的重定向操作,>等同于1>。上面栗子执行命令【ls 123.txt > stdout.txt】得到的效果也是一样的。

重定向标准错误stderr

如上图所示,文件描述符2,标准错误的重定向也是同样的原理被记录在了文件stderr.txt这个文件里面了。

描述符的重定向还有下面的几种用法:

你可以将stderr单独定向到一个文件,将stdout重定向到另一个文件:

cmd 2>stderr.txt 1>stdout.txt

也可以利用下面的方法,将stderr转换成stdout,使得stderr和stdout都被重新定向到同一个文件中:

cmd> output.txt 2>&1

或者采用这个方法(这个经常用到,我个人比较喜欢用这个,少写几个字符(*^__^*) )

cmd &> output.txt

cmd >& output.txt # 两个表达式效果一样哒~

(终于最后一个知识点,原来认真答题码字这么嘞。摔~)

3. linux特殊文件

手抄一段《linux shell脚本攻略》描述:

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

简单地理解就是,重定向操作给这个/dev/null文件的所有东西都会被丢弃。

因为这些文件描述符输出的字符串,总是会显示出来的。如果我们在shell编程的时候,操作到某一条命令的返回结果,我们不想要这个时候又不想让这个输出结果打印到屏幕上(打印错误,多不好看对不对^_^)我们就可以重定向到/dev/null这个文件来,由/dev/null这个文件负责处理后事。

这个丢弃的结果又不能粗暴的认为是删除错误输出,这个操作是一个丢弃重定向输入输出的操作。

形象地理解就是,ATM机打印的纸质流水账单(stdout和stderr)本来应该你来保存处理的,但是你又没有用放在手里(打印屏幕)又碍事,所以账单从你的手里重新被丢到了垃圾桶(/dev/null)了。但是,垃圾桶的垃圾是怎么处理的你是不知道的。

不知道上面的描述,答主是不是能明白这三个知识点了?只要理解了上面的三个点,其实答主的第三个问题很好滴能解决了。

问题3的思路

让一个变量获得命令输出的结果,是下面这样的处理:

i=$(ls 123.txt)

这样,i 就能获得命令【ls 123.txt】输出的标准输出。错误提示(标准错误)依然会打印到屏幕上显示。(万分感谢 @张超 同学在评论中指正的我的错误^_^)

针对答主的问题,应该是如下操作:

i=$(ls 123.txt 2> /dev/null)

这样的命令,ls命令如果出现了错误提示,就会被重定向到/dev/null垃圾桶去了。所以,屏幕上不会打印任何输出关于错误的提示字符。在这个命令的操作中,i 获得文件stdout标准输出,也就是文件述符1的屏幕输出结果"123.txt"。

如果,这个123.txt文件不存在,i 就肯定什么都拿不到,因为错误提示被/dev/null 吃了(划掉),被重定向丢弃了屏幕也不显示错误提示。所以,i 就是个什么都没有的空变量。基本就是如下效果一样:

i=''

linux /dev/null,Shell中 /dev/null和 /dev/null 21相关推荐

  1. python获取耗时的shell_python获取耗时的shell_关于Linux:在shell中获取程序执行时间...

    我想在Linux shell中在几个不同的条件下执行一些东西,并且能够输出每次执行的执行时间. 我知道我可以编写一个Perl或python脚本来完成这个任务,但是有没有一种方法可以在shell中完成呢 ...

  2. linux基础:shell中的sh与bash区别与常用命令

    目录 一,什么是sh和bash? 二,shell的基本用法 2.1,变量 2.2,算术运算 2.3,使用 bash 计算器在shell脚本中进行浮点运算 2.4,shell中的条件判断命令test和[ ...

  3. linux脚本除号,shell中常用的特殊符号整理

    在shell中常用的特殊符号罗列如下: # ; ;; . , / \ 'string'| ! $ ${} $? $$ $* "string"* ** ? : ^ $# $@ `co ...

  4. linux脚本冒号,Shell中的冒号 :

    {str:=expr}如果变量str不为空,${str:=expr}就等于str的值,若str为空,就把expr的值赋值给str. 用途说明 我们知道,在Linux系统中,冒号(:)常用来做路径的分隔 ...

  5. linux 算术命令,shell中进行算术运算的各种方法

    shell中,无法直接进行算术运算,如果直接进行算术运算会出现如下情况. 从上图可以看出,默认情况下,shell不会直接进行算术运算,而是把"算术符号"当做"字符串&qu ...

  6. 学习linux杂七杂八——关于shell中的变量

    var=value 变量定义并赋值,注意等号前后不能与空格相邻,如果需要有空格(其他特> 殊字符,如$,回车,",',\等)可用转义字符\进行转义. 变量命名规则同C语言. 变量值两端 ...

  7. linux 脚本map,shell中map的用法

    ##实例代码 #!/bin/bash cat ./switchsql.txt | while read line do tmp_partition_name=`echo $line | awk -F ...

  8. shell脚本中linux命令特殊字符,shell中的特殊字符

    shell中除使用普通字符外,还可以使用一些具有特殊含义和功能的特殊字符.在使用它们时应注意其特殊的含义和作用范围. 下面分别对这些特殊字符加以介绍. 1.通配符 通配符用于模式匹配,如文件名匹配.路 ...

  9. linux dd devzero,makefile中ifeq与ifneq dev/null和dev/zero简介 dd命令

    ifeq语法是ifeq ";" ";"  ,功能是比较参数"arg1"和"arg2"的值是否相同,相同时为1 ifneq ...

最新文章

  1. WCF NetTcpBinding Transport安全模式(6) ClientCredentialType证书验证模式---- PeerTrust验证模式...
  2. 金环(2017佛山市选拔初中组)
  3. BZOJ-1878-HH的项链-SDOI2009
  4. CodeForces - 600E Lomsat gelral(树上启发式合并)
  5. 解决Spring自动装配中的循环依赖
  6. 难道网上就没有真正完全无误的Postfix教程了吗?
  7. 在c 语言中 一个函数由函数头和,C语言程序设计基础教程_习题答案
  8. mysql efbbbf_MySQL中修理特殊不可见uft8字符 - trim
  9. MATLAB_平面几何_判断两平面矩形是否干涉
  10. c语言运算符优先级结合,C语言运算符优先级和结合性
  11. python中spider的用法_python网络爬虫 CrawlSpider使用详解
  12. 基于jquery打造的一款全页面图片分享特效
  13. 微信/qq消息-定时自动循环发送
  14. mysql读mdf_mdf文件如何导入MySQL数据库?
  15. 电力电子 中英 对照
  16. php theexcerpt,WordPress获取文章摘要函数the_excerpt详解
  17. 读博与怠工(在北航硕博连读)——转载
  18. 医咖会stata 笔记(自己能看懂版
  19. Redis过期策略---实现原理
  20. 王牌战士没显示我的服务器,王牌战士号没了怎么回事 游戏档案被销号解决方法...

热门文章

  1. keras提取模型中的某一层_Tensorflow笔记:高级封装——Keras
  2. mysql 文本备份_[MySQL]用mysqldump制作文本备份_MySQL
  3. linux之移动或重命名文件:mv
  4. 计算机双系统,自己在计算机上安装双系统
  5. orb特征 稠密特征_一种基于ORB-SLAM2的双目三维稠密建图方法技术
  6. android p preview_细数 Android P 开发者预览版中最不能错过的新特性
  7. php编译成jphp,php编译脚本安装
  8. 为什么吃红薯容易放屁
  9. 逍遥android模拟器设置,逍遥安卓模拟器最佳设置电脑上玩手游流畅不卡多开更好用...
  10. 11g表名大小写 oracle_oracle表名、字段名大小写问题。