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


13

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

Answers:


17

不幸的是,假设 stderr 仅用于错误输出并不总是正确的。相反, stderr 通常用于任何和所有 互动 输出和诊断,即用于用户在交互式提示中读取的输出 1 wgetdd 是众所周知的例子。

一些命令将提供一个标志(例如 -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 & (尾随的地方 & 使它在后台运行)

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


1 甚至没有保证不会出现错误输出 stdout - 有些程序会将所有输出转储到那里!

2 不幸的是,情况并非总是如此 - 退出代码完全由程序控制,有些将指示一些非零退出的成功条件。再次,查看手册。


轻微的鱼调整,有一个特殊的地方把功能放在〜/ .config / fish / functions /
Xster

12

Unix实用程序发送常规消息 stdout和错误消息 stderr,所以如果我们只想查看错误消息,那么抑制就足够了 stdout 所以只有 stderr 获取输出到控制台。

这样做的方式(两者都有 bashfish )是追加 >/dev/null 对命令。这会将stdout标记为虚无,但stderr(带有您的错误消息)仍然会进入控制台。

例如:

命令 echo 1 >/dev/null 什么都不打印,因为正常 stdout 输出被抑制,没有任何内容被写入stderr。

命令 man doesnotexist >/dev/null 打印错误消息,因为 man 将其错误消息写入 stderr


2

这将在后台运行该命令并将错误写入日志文件,同时忽略正常输出

    command > /dev/null 2> /tmp/example_error.log &
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.