【问题标题】:How do I conditionally redirect the output of a command to /dev/null?如何有条件地将命令的输出重定向到 /dev/null?
【发布时间】:2023-04-08 20:07:01
【问题描述】:

我有一个脚本。我想给这个脚本一个安静模式和一个详细模式。

这相当于:

if $verbose
then
  redirect="> /dev/null"
fi

echo "Verbose mode enabled" $redirect # This doesn't work because the redirect isn't evaluated.

我真的想要一种比为每个受影响的语句编写 if-else 更好的方法。

eval 可以工作,但对其他变量有明显的副作用。

【问题讨论】:

标签: bash redirect


【解决方案1】:

你可以写一个包装函数:

redirect_cmd() {
    # write your test however you want; this just tests if SILENT is non-empty
    if [ -n "$SILENT" ]; then
        "$@" > /dev/null
    else
        "$@"
    fi
}

然后您可以使用它来运行任何带有重定向的命令:

redirect_cmd echo "unsilenced echo"
redirect_cmd ls -d foo*

SILENT=1
redirect_cmd echo "nothing will be printed"
redirect_cmd touch but_the_command_is_still_run

(如果您需要做的只是回显这个,您当然可以使函数更简单,只需回显第一个参数而不是将它们全部作为命令运行)

【讨论】:

  • 我喜欢这个解决方案。 echo 只是一个例子。我本可以选择一个更好的。
  • @Vlad:哎呀。我不知道我通常在那里的强迫引用发生了什么。已编辑!
  • 这个答案很好用。但是我发现一个失败的使用场景:redirect_cmd CC=gcc CFLAGS="-O2 -g0" ./configure ${SQLITE_CONFIGURE_OPT} --prefix=${CURR_DIR} /${INSTALL_DIR} 我收到错误 utils/util-optout.sh: line 33: CC=gcc: command not found.. 任何线索???
  • 一个更简单的示例,说明此解决方案的有效和无效;这失败了:redirect_cmd CC=g++ make all; ....但如果您在末尾移动 CC=g++ 选项,它会起作用,如下所示:redirect_cmd make all CC=g++;
  • redirect_cmd 应该是return $? 因为redirect_cmd some_action && echo 'success' || echo 'failure'
【解决方案2】:

another question得到这个想法:

#!/bin/sh

if [ $SILENT ]; then
    exec &>/dev/null
fi

echo "Silence here."

【讨论】:

  • 如果 SILENT 是空字符串,如果 SILENT 是空字符串,则该测试会给出错误。
【解决方案3】:

不完美,但是如何设置重定向到“/dev/null”或“/dev/tty”,然后做

{
   echo "verbose"
    ....
} > $redirect

【讨论】:

  • /dev/stdout,而不是 /dev/tty。即使脚本被重定向,使用后者总是会导致它进入显示。
【解决方案4】:

考虑是否值得设置set -x 以在详细模式下详细记录到标准错误。如果是这样,那么可以通过像这样的无操作 : 来实现仅详细输出。

while getopts "v" o
do case "$o" in
   v) set -x;;
   esac
done

echo "This will always be output"           # goes to stdout
: this will only be output in verbose mode  # goes to stderr

: 评估它的参数,但对它们不做任何事情。 set -x 将显示每个语句执行时在 stderr 上评估的内容。

它还允许您按流拆分详细日志和标准日志。

这里可能不是您需要的,但它可能是一个方便的技巧。

【讨论】:

    猜你喜欢
    • 2018-05-13
    • 1970-01-01
    • 2023-03-06
    • 2012-01-15
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2019-10-11
    相关资源
    最近更新 更多