仅在成功时隐藏 shell 命令的输出?

仅在成功时隐藏 shell 命令的输出?

隐藏 shell 命令的输出通常涉及重定向 stderr 和 stdout。是否有任何内置工具或命令默认隐藏输出,但在出错时转储所有累积输出?我想将其作为远程ssh命令的包装器运行。现在我使用重定向让它们运行,但我不知道是什么导致它们失败,而且它们太冗长了。

编辑:最后,我根据 @Belmin 的回答创建了以下模板,并对其进行了一些调整,以累积脚本中的所有先前命令,使用当前进程标识符,自动删除日志,并在出现问题时添加失败的红色错误消息。在此模板中,初始silent包装器将成功,然后第三个命令将失败,因为目录已存在:

#!/bin/sh

set -e

SILENT_LOG=/tmp/silent_log_$$.txt
trap "/bin/rm -f $SILENT_LOG" EXIT

function report_and_exit {
    cat "${SILENT_LOG}";
    echo "\033[91mError running command.\033[39m"
    exit 1;
}

function silent {
    $* 2>>"${SILENT_LOG}" >> "${SILENT_LOG}" || report_and_exit;
}

silent mkdir -v pepe
silent mkdir -v pepe2
silent mkdir -v pepe
silent mkdir -v pepe2

答案1

我会设置一个bash 函数像这样:

function suppress
{
   /bin/rm --force /tmp/suppress.out 2> /dev/null; \
   ${1+"$@"} > /tmp/suppress.out 2>&1 || \
   cat /tmp/suppress.out; \
   bin/rm /tmp/suppress.out;
}

然后,您只需运行以下命令:

suppress foo -a bar

答案2

为此目的编写脚本应该相当容易。

类似于这个完全未经测试的脚本。

OUTPUT=`tempfile`
program_we_want_to_capture &2>1 > $OUTPUT
[ $? -ne 0 ]; then
    cat $OUTPUT
    exit 1
fi
rm $OUTPUT

另一方面,对于我作为脚本的一部分运行的命令,我通常希望得到比简单地打印所有输出更好的东西。我经常将我看到的内容限制在未知范围内。这是我根据十多年前读过的东西改编的脚本。

#!/bin/bash

the_command 2>&1 | awk '
BEGIN \
{
  # Initialize our error-detection flag.
  ErrorDetected = 0
}
# Following are regex that will simply skip all lines
# which are good and we never want to see
/ Added UserList source/ || \
/ Added User/ || \
/ init domainlist / || \
/ init iplist / || \
/ init urllist / || \
/ loading dbfile / || \
/^$/ {next} # Uninteresting message.  Skip it.

# Following are lines that we good and we always want to see
/ INFO: ready for requests / \
{
  print "  " $0 # Expected message we want to see.
  next
}

# any remaining lines are unexpected, and probably error messages.  These will be printed out and highlighted.
{
  print "->" $0 # Unexpected message.  Print it
  ErrorDetected=1
}

END \
{
  if (ErrorDetected == 1) {
    print "Unexpected messages (\"->\") detected in execution."
    exit 2
  }
}
'
exit $?

答案3

不要在这个问题上重新发明轮子。这是一个常见问题,尤其是 cron 作业,这就是创建cronic/的原因chronic。您可以从包管理器中安装一个,用法非常简单:

cronic noisy_command --param paramval

它将抑制所有输出,除非嘈杂的命令产生非跟踪错误输出或具有非零退出状态。

答案4

尝试一下:

out=`command args...` || echo $out

相关内容