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
。