Linux Bash Shell高级重定向操作--深入了解标准错误输出和标准输出

简介:

    一般来说一个程序的输出可分为标准输出和标准错误输出,这个已经众人皆知。但打印到屏幕上的输出一定是标准输出吗?答案是否定的!默认打印到屏幕上的输出不一定是标准输出。

举一个最常用的例子。我想通过nginx -v或ngxin -V查看nginx的版本信息,如果我只想要最后面的版本号,那我只需要用awk或cut处理就行。例如想获得“nginx version: nginx/1.2.7”中的“1.2.7”,理想的命令行是“nginx -v | grep nginx | cut -d '/' -f2”或“nginx -v | cut -d '/' -f2”或“nginx -v | grep nginx | awk -F '/' '{print $2}'”,但实际上依然会输出“nginx version: nginx/1.2.7”,你可能认为是不是我用echo的方法就能实现呢?也不是的。例如用命令行“echo $(nginx -v) | grep nginx | awk -F '/' '{print $2}'”或“echo $(nginx -v) | grep nginx | cut -d '/' -f2”也是不行的。

    但怎么就行了呢?答案是使用“2>&1 |”或“|&”(二者等价),将命令1的标准错误输出作为命令2的标准输入。

    解释:nginx -v的默认输出是标准错误输出(标准错误输出并不代表是执行返回值为1,如使用“echo $?”查看返回值为0(已正确执行))。例如我们可以测试一下,将“输出”(此时假设不知道它是标准输出还是标准错误输出)重定向到文件,再查看文件的内容。例如执行“nginx -v > test”时屏幕会输出“nginx version: nginx/1.2.7”,这表明屏幕上出现的是标准错误输出。当然了,你也可以用查看文件的方式“cat test”发现有这个文件,但内容却是空的,也说明这个命令没有输出标准输出。

    关于列截取。但在列截取的工具选择上,如果是可以将单字符作为间隔符,则最好是使用cut,经过测试发现,awk不能直接处理标准错误输出,即使将标准错误输出转化成标准输出后依然会有问题。例如“echo $(nginx -v) |& grep nginx | awk -F '/' '{print $2}'”和“echo $(nginx -v) | grep nginx | awk -F '/' '{print $2}'”以及“echo $(nginx -v) 2>&1 | grep nginx |& awk -F '/' '{print $2}'”的结果是完全一样的。而cut能处理标准错误输出但是有一种情况例外,“nginx -v |& grep nginx | awk -F '/' '{print $2}'”可以输出正确结果,“1.2.7”。

    除此之外,在测试的过程中发现,grep也不能直接处理标准错误输出。“echo $(nginx -v) 2>&1 | grep nginx > test”和“echo $(nginx -v) |& grep nginx > test”的结果都是test中没有任何内容,它只会输出“nginx version: nginx/1.2.7”。换成“nginx -v |& grep nginx”就能。

    tee也不能(tee不是标准的bash指令)!有点坑不是吗?

    参考:Bash Reference Manual的3.2.2 Pipelines http://www.gnu.org/software/bash/manual/bashref.html#Pipelines

    If ‘|&’ is used, the standard error ofcommand1is connected tocommand2’s standard input through the pipe; it is shorthand for 2>&1 |. This implicit redirection of the standard error is performed after any redirections specified by the command.

    因此,在类似调试出现问题时,确认是否是标准错误输出以及是否要处理也是一个值得考虑的点。




本文转自 urey_pp 51CTO博客,原文链接:http://blog.51cto.com/dgd2010/1419955,如需转载请自行联系原作者

相关文章
|
2月前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
1月前
|
Web App开发 网络协议 Linux
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
这篇文章是关于Linux命令的总结,涵盖了从基础操作到网络配置等多个方面的命令及其使用方法。
62 1
linux命令总结(centos):shell常用命令汇总,平时用不到,用到就懵逼忘了,于是专门写了这篇论文,【便持续更新】
|
20天前
|
运维 监控 Shell
深入理解Linux系统下的Shell脚本编程
【10月更文挑战第24天】本文将深入浅出地介绍Linux系统中Shell脚本的基础知识和实用技巧,帮助读者从零开始学习编写Shell脚本。通过本文的学习,你将能够掌握Shell脚本的基本语法、变量使用、流程控制以及函数定义等核心概念,并学会如何将这些知识应用于实际问题解决中。文章还将展示几个实用的Shell脚本例子,以加深对知识点的理解和应用。无论你是运维人员还是软件开发者,这篇文章都将为你提供强大的Linux自动化工具。
|
2月前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
2月前
|
人工智能 监控 Shell
常用的 55 个 Linux Shell 脚本(包括基础案例、文件操作、实用工具、图形化、sed、gawk)
这篇文章提供了55个常用的Linux Shell脚本实例,涵盖基础案例、文件操作、实用工具、图形化界面及sed、gawk的使用。
455 2
|
1月前
|
存储 Shell Linux
【Linux】shell基础,shell脚本
Shell脚本是Linux系统管理和自动化任务的重要工具,掌握其基础及进阶用法能显著提升工作效率。从简单的命令序列到复杂的逻辑控制和功能封装,Shell脚本展现了强大的灵活性和实用性。不断实践和探索,将使您更加熟练地运用Shell脚本解决各种实际问题
25 0
|
2月前
|
Shell Linux 开发工具
linux shell 脚本调试技巧
【9月更文挑战第3天】在Linux中调试shell脚本可采用多种技巧:使用`-x`选项显示每行命令及变量扩展情况;通过`read`或`trap`设置断点;利用`echo`检查变量值,`set`显示所有变量;检查退出状态码 `$?` 进行错误处理;使用`bashdb`等调试工具实现更复杂调试功能。
|
3月前
|
监控 Shell Linux
在Linux中,如何使用shell脚本检测磁盘使用率?
在Linux中,如何使用shell脚本检测磁盘使用率?
|
3月前
|
Shell Linux 开发工具
在Linux中,如何编写shell脚本将当前目录下大于10K的文件转移到/tmp目录下?
在Linux中,如何编写shell脚本将当前目录下大于10K的文件转移到/tmp目录下?
|
3月前
|
缓存 Shell Linux
在Linux中,bash shell 中的 hash 命令有什么作用?
在Linux中,bash shell 中的 hash 命令有什么作用?