文档章节

如何管stderr,而不是stdout?

 技术盛宴
发布于 2019/12/15 18:57
字数 954
阅读 32
收藏 0

我有一个要写入信息的程序stdoutstderr ,我需要grep通过什么是未来标准错误 ,而忽视标准输出

我当然可以分2步完成:

command > /dev/null 2> temp.file
grep 'something' temp.file

但我宁愿能够在没有临时文件的情况下做到这一点。 有没有任何智能管道技巧?


#1楼

对于那些想要将stdout和stderr永久重定向到文件的人,在stderr上grep,但保持stdout将消息写入tty:

# save tty-stdout to fd 3
exec 3>&1
# switch stdout and stderr, grep (-v) stderr for nasty messages and append to files
exec 2> >(grep -v "nasty_msg" >> std.err) >> std.out
# goes to the std.out
echo "my first message" >&1
# goes to the std.err
echo "a error message" >&2
# goes nowhere
echo "this nasty_msg won't appear anywhere" >&2
# goes to the tty
echo "a message on the terminal" >&3

#2楼

结合这些答案中的最佳答案,如果您这样做:

command 2> >(grep -v something 1>&2)

...然后所有stdout都保存为stdout, 并且所有stderr都保存为stderr,但是你不会在stderr中看到包含字符串“something”的任何行。

这具有独特的优点,即不反转或丢弃stdout和stderr,也不会将它们混合在一起,也不使用任何临时文件。


#3楼

如果你想一想“重定向”和“管道”的真实情况,那么可视化的东西要容易得多。 bash中的重定向和管道做一件事:修改进程文件描述符0,1和2指向的位置(参见/ proc / [pid] / fd / *)。

管道或“|” 运算符出现在命令行中,首先要发生的是bash创建一个fifo并将左侧命令的FD 1指向此fifo,并将右侧命令的FD 0指向同一个fifo。

接下来, 从左到右评估每一侧的重定向运算符,并且每当重复描述符时使用当前设置。 这很重要,因为由于管道是先设置的,所以FD1(左侧)和FD0(右侧)已经从它们通常的状态改变了,这些的重复将反映这一事实。

因此,当您键入以下内容时:

command 2>&1 >/dev/null | grep 'something'

以下是按顺序发生的事情:

  1. 创建一个管道(fifo)。 “命令FD1”指向此管道。 “grep FD0”也指向这个管道
  2. “命令FD2”指向“命令FD1”当前指向的位置(管道)
  3. “命令FD1”指向/ dev / null

因此,“命令”写入其FD 2(stderr)的所有输出都进入管道,并由另一侧的“grep”读取。 “命令”写入其FD 1(stdout)的所有输出都会进入/ dev / null。

相反,如果您运行以下内容:

command >/dev/null 2>&1 | grep 'something'

这是发生的事情:

  1. 创建管道并指向“命令FD 1”和“grep FD 0”
  2. “命令FD 1”指向/ dev / null
  3. “命令FD 2”指向FD 1当前指向的位置(/ dev / null)

所以,“command”中的所有stdout和stderr都转到/ dev / null。 没有任何东西进入管道,因此“grep”将关闭而不在屏幕上显示任何内容。

另请注意,重定向(文件描述符)可以是只读(<),只写(>)或读写(<>)。

最后一点。 程序是否将某些内容写入FD1或FD2,完全取决于程序员。 良好的编程习惯要求错误消息应该转到FD 2并且正常输出转换为FD 1,但是您经常会发现混合两者的草率编程或者忽略惯例。


#4楼

我试着跟着,发现它也有用,

command > /dev/null 2>&1 | grep 'something'

#5楼

你在用bash吗? 如果是这样:

command >/dev/null |& grep "something"

http://www.gnu.org/software/bash/manual/bashref.html#Pipelines

本文转载自:https://stackoom.com/question/9pTW/如何管stderr-而不是stdout

粉丝 0
博文 796
码字总数 0
作品 0
深圳
高级程序员
私信 提问
在通过管道使用“ tee”时如何将stderr写入文件?

我知道如何使用将的输出( ) ,同时仍将其显示在终端中: 现在如何将写入一个名为的文件,同时仍然显示它? #1楼 换句话说,您希望将stdout传递到一个过滤器( ),将stderr 给另一个过滤器...

javail
01/15
13
0
python中执行命令的3种方法小结

目前我使用到的python中执行cmd的方式有三种: 1. 使用os.system("cmd") 特点是执行的时候程序会打出cmd在linux上执行的信息。 2. 使用Popen模块产生新的process 现在大部分人都喜欢使用Pop...

楠木楠
2016/09/20
52
0
Python_cmd的各种实现方法及优劣

使用os.system("cmd") 这是最简单的一种方法,特点是执行的时候程序会打出cmd在linux上执行的信息。使用前需要import os。 os.system("ls") 2. 使用Popen模块产生新的process 现在大部分人都...

北方攻城师
2014/05/28
735
0
python 命令执行的方法整理

在python开发中,我们常常需要执行命令,修改相关信息。那对于初学者来说,python中如何执行命令呢?今天,小编就为大家分享3种python命令执行的方法。 1. 使用os.system("cmd") 在python中,...

小麦麦子
2015/06/24
1.8K
0
python subprocess Popen

subprocess.Popen(args 参数args可以是字符串或者序列类型(如:list,元组),用于指定进程的可执行文件及其参数.如果是序列类型,第一个元素通常是可执行文件的路径.我们也可以显式的使用execute...

睡懒觉的猫
2011/05/31
998
0

没有更多内容

加载失败,请刷新页面

加载更多

WPF中的StaticResource和DynamicResource有什么区别?

在WPF中使用画笔,模板和样式等资源时,可以将它们指定为StaticResources <Rectangle Fill="{StaticResource MyBrush}" /> 或者作为DynamicResource <ItemsControl ItemTemplate="{DynamicR......

javail
29分钟前
49
0
Day07继承中的面试题 答案

1. 每一个构造方法的第一条语句默认都是:super() Object类最顶层的父类。 class Zi extends Fu{ public int num = 20; public Zi(){ //super(); System.out.println("zi"); } 2.class Test......

Lao鹰
34分钟前
42
0
每天AC系列(四):四数之和

1 题目 Leetcode第18题,给定一个数组与一个target,找出数组中的四个数之和为target的不重复的所有四个数. 2 暴力 List<List<Integer>> result = new ArrayList<>();if (nums.length == 4 &......

Blueeeeeee
44分钟前
54
0
git clone --mirror和git clone --bare有什么区别

git clone帮助页面上有关于--mirror : 设置远程存储库的镜像。 这意味着--bare 。 但没有详细介绍--mirror克隆与--bare克隆--mirror不同。 #1楼 克隆将从远程服务器复制参考,并将其填充到名...

技术盛宴
今天
72
0
代码生成器技术乱弹二十六,未来之野望,未实现的功能:动态Controller名字后缀

现在,光1.5.0的Controller后缀是固定的。比如:UserController, PrivilegeController之类的。而动态Controller名字后缀功能实现后,您只需要定义 controllernamingsuffix:Adaoter Control...

火箭船
今天
53
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部