有几种方法可以写入stderr:
# Note: this first one does not work in Python 3
print >> sys.stderr, "spam"
sys.stderr.write("spam\n")
os.write(2, b"spam\n")
from __future__ import print_function
print("spam", file=sys.stderr)
Run Code Online (Sandbox Code Playgroud)
这似乎与Python#13 †的禅宗相矛盾,那么这里有什么区别,这种方式有哪些优点或缺点?应该使用哪种方式?
† 应该有一个 - 最好只有一个 - 显而易见的方法.
我有一个程序可以将信息写入stdout和stderr,并且我需要grep通过什么来到stderr,而忽略了stdout.
我当然可以分2步完成:
command > /dev/null 2> temp.file
grep 'something' temp.file
Run Code Online (Sandbox Code Playgroud)
但我宁愿能够在没有临时文件的情况下做到这一点.有没有任何智能管道技巧?
我正在运行一个bash脚本,它创建一个日志文件来执行命令
我使用以下内容
Command1 >> log_file
Command2 >> log_file
Run Code Online (Sandbox Code Playgroud)
这仅发送标准输出,而不是终端上显示的标准错误.
我可以记录记录到文件的stderr和stdout吗?
我对这三个文件的目的感到困惑.如果我的理解是正确的,stdin程序写入其在进程中运行任务的请求stdout的文件是内核写入其输出stderr的文件,并且请求它的进程从中访问信息,并且是文件到输入所有例外情况.在打开这些文件以检查这些文件是否确实发生时,我发现似乎没有任何建议!
我想知道的是这些文件的目的究竟是什么,用非常少的技术术语绝对愚蠢地回答!
假设我有一个如下脚本:
useless.sh
echo "This Is Error" 1>&2
echo "This Is Output"
Run Code Online (Sandbox Code Playgroud)
我有另一个shell脚本:
alsoUseless.sh
./useless.sh | sed 's/Output/Useless/'
Run Code Online (Sandbox Code Playgroud)
我想将"This Is Error"或者useless.sh中的任何其他stderr捕获到变量中.我们称之为ERROR.
请注意,我正在使用stdout.我想继续使用stdout,因此在这种情况下将stderr重定向到stdout是没有用的.
所以,基本上,我想做
./useless.sh 2> $ERROR | ...
Run Code Online (Sandbox Code Playgroud)
但这显然不起作用.
我也知道我能做到
./useless.sh 2> /tmp/Error
ERROR=`cat /tmp/Error`
Run Code Online (Sandbox Code Playgroud)
但那是丑陋和不必要的.
不幸的是,如果没有答案出现在这里,那就是我将要做的事情.
我希望还有另一种方式.
有没有更好的想法?
似乎较新版本的bash具有&>运算符,如果我理解正确的话,将stdout和stderr重定向到一个文件(&>>改为附加到文件,就像Adrian澄清的那样).
实现相同目标的最简单方法是什么,而是管道到另一个命令?
例如,在这一行:
cmd-doesnt-respect-difference-between-stdout-and-stderr | grep -i SomeError
Run Code Online (Sandbox Code Playgroud)
我希望grep能够匹配stdout和stderr中的内容(实际上,将它们组合成一个流).
注意:这个问题是询问管道,而不是重定向 - 因此它不是它当前标记为重复的问题的副本.
众所周知如何将流程的标准输出管道传输到另一个流程标准输入:
proc1 | proc2
Run Code Online (Sandbox Code Playgroud)
但是如果我想将proc1的标准错误发送到proc2并将标准输出保留到当前位置呢?你会认为bash会有一个命令:
proc1 2| proc2
Run Code Online (Sandbox Code Playgroud)
但是,唉,没有.有没有办法做到这一点?
我有一个应用程序,它会将大量噪音记录到stderr,并且真的会减慢应用程序的执行速度.我想将该输出重定向到null.这可能与cmd.exe一起使用吗?
阅读手册页和一些代码并没有真正帮助我理解它们之间的区别 - 或者更好,当我应该使用 - perror("...")或者fprintf(stderr, "...").
在C中,使用printffrom 来打印到标准输出很容易stdio.h.
但是,如何打印到stderr?我们可以fprintf用来实现它,但它的语法似乎很奇怪.也许我们可以printf用来打印到stderr?