Answers:
不幸的是,假设 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
如果您没有链接命令,也可以使用一些快捷方式:
if command 2>/tmp/outputbuffer
cat /tmp/outputbuffer
rm /tmp/outputbuffer
要么:
command 2>/tmp/outputbuffer; or cat /tmp/outputbuffer; rm /tmp/outputbuffer;
你也可以管 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-silent somecommand & (尾随的地方 & 使它在后台运行)
请注意,这将吞下原始退出代码,并将两者都转储 stdout 和 stderr 如果发生故障。您可以根据需要进行自定义。
1 甚至没有保证不会出现错误输出 stdout - 有些程序会将所有输出转储到那里!
2 不幸的是,情况并非总是如此 - 退出代码完全由程序控制,有些将指示一些非零退出的成功条件。再次,查看手册。
Unix实用程序发送常规消息 stdout和错误消息 stderr,所以如果我们只想查看错误消息,那么抑制就足够了 stdout 所以只有 stderr 获取输出到控制台。
这样做的方式(两者都有 bash 和 fish )是追加 >/dev/null 对命令。这会将stdout标记为虚无,但stderr(带有您的错误消息)仍然会进入控制台。
例如:
命令 echo 1 >/dev/null 什么都不打印,因为正常 stdout 输出被抑制,没有任何内容被写入stderr。
命令 man doesnotexist >/dev/null 打印错误消息,因为 man 将其错误消息写入 stderr。