除非出现错误,否则如何在没有输出的情况下在后台运行命令

Xst*_*ter 17 shell fish

如果命令退出编码错误,如何抑制命令的输出但显示它?

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 &(尾随&导致它在后台运行)

请注意,这将吞下原始退出代码,stdoutstderr在发生故障时转储两者。您可以根据需要对其进行自定义。


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.