Bob*_*Bob 20
不幸的是,stderr
仅用于错误输出的假设并不总是正确的。相反,stderr
通常用于任何和所有交互式输出和诊断,即旨在供用户阅读交互式提示1 的输出。wget
并且dd
是众所周知的例子。
一些命令将提供一个标志(例如-quiet
或-silent
)来抑制非错误输出 - 阅读他们的手册页以查看是否存在。
另一个更常见的约定是退出代码:程序在退出时返回退出代码。通常为2,退出代码0
表示成功,任何其他退出代码表示错误。
使用bash
,您可以从$?
变量中获取最后一条命令的退出代码。在 中fish
,使用$status
变量。您可以通过管道stderr
传输到临时文件,并且仅在发生错误时才打印它。例如(fish
):
command 2>/tmp/outputbuffer
if $status
cat /tmp/outputbuffer
rm /tmp/outputbuffer
Run Code Online (Sandbox Code Playgroud)
如果您不链接命令,您还可以使用一些快捷方式:
if command 2>/tmp/outputbuffer
cat /tmp/outputbuffer
rm /tmp/outputbuffer
Run Code Online (Sandbox Code Playgroud)
或者:
command 2>/tmp/outputbuffer; or cat /tmp/outputbuffer; rm /tmp/outputbuffer;
Run Code Online (Sandbox Code Playgroud)
您还可以使用管道stdout
传输到相同的缓冲区2>&1 >/tmp/outputbuffer
。
(注意:我实际上并不知道fish
,所以我正在根据我在其文档中找到的内容调整这个概念。语法可能有点错误。此外,您可以使用mktemp
生成一个唯一的临时文件 - 运行它并记录变量中的文件名。)
如果您需要在同时以交互方式使用的 shell 的后台运行整个过程,那么您最好编写一个脚本来处理输出隐藏并使用标准技术在后台运行该脚本( fish
). 哎呀,您可以将类似以下函数的内容放入~/.config/fish/config.fish
:
function run-silent
set temp (mktemp)
if $argv 2>&1 >$temp
cat $temp
rm $temp
end
Run Code Online (Sandbox Code Playgroud)
调用 with run-silent somecommand &
(尾随&
导致它在后台运行)
请注意,这将吞下原始退出代码,stdout
并stderr
在发生故障时转储两者。您可以根据需要对其进行自定义。
1甚至不能保证错误输出不会出现stdout
- 有些程序会将所有输出转储到那里!
2不幸的是,情况并非总是如此 - 退出代码完全由程序控制,有些会指示一些非零退出的成功条件。再次,检查手册。
Max*_*ter 13
Unix 实用程序将一般消息发送到stdout
,并将错误消息发送到stderr
,因此如果我们只想查看错误消息,那么抑制就足够了,stdout
因此只stderr
将输出输出到控制台。
执行此操作的方法(在bash
和 中fish
)是附加>/dev/null
到命令。这会将 stdout 导入虚无,但 stderr(带有您的错误消息)仍会到达控制台。
所以例如:
该命令不echo 1 >/dev/null
打印任何内容,因为正常stdout
输出被抑制,并且没有任何内容写入 stderr。
该命令会man doesnotexist >/dev/null
打印一条错误消息,因为man
将其错误消息写入stderr
.
归档时间: |
|
查看次数: |
7964 次 |
最近记录: |