bash 中可以有条件地将输出重定向到 stdout 或 /dev/null 吗?

bash 中可以有条件地将输出重定向到 stdout 或 /dev/null 吗?

用例:

我正在编写一个脚本,该脚本将接受--simulate该脚本作为试运行,并且仅打印命令而不是运行它。正常运行时(即不使用--simulate),运行的命令会在控制台上生成大量输出,我希望能够隐藏这些输出。

当前的

目前,我正在做一些与此类似的事情(稍微简化了一点),并且正在循环运行以处理几个与 Windows 游戏相关的专有存档格式的压缩文件。

# flag variable
mode='';
if [[ "--simulate" == "$1" ]]; then
    mode="echo";
fi

# command is a long wine command that takes a mess of arguments
# and generates a LOT of output
${mode} command

我被困在哪里

当我考虑更改${mode} commandto以避免控制台噪音时,我意识到这也会产生从to${mode} command 2>&1 >/dev/null发送输出的效果。echo--simulate/dev/null

我知道一种选择是只使用 IF 块 /test并维护语句的多个副本,但很好奇是否有更好的方法。

认为可能有某种方法可以做类似以下的事情,但在谷歌/此处找不到它,所以我想以防万一我会问。

# flag variable
mode='';
redirectOutputTo='/dev/null';
if [[ "--simulate" == "$1" ]]; then
    mode="echo";
    redirectOutputTo="stdout";
fi

# If this is run as is, it will just create a file named 'stdout' in the script folder
# bc I assume that is not the real name. Ditto for using '&1'; just creates a file.
${mode} command 2>&1 >${redirectOutputTo}

Bash/操作系统版本

如果有什么不同,这是我的系统正在运行的内容(Mint 19.3 x64):

$ bash --version|head -1
GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)

$ uname -vo
#56~18.04.1-Ubuntu SMP Wed Jun 24 16:17:03 UTC 2020 GNU/Linux

答案1

使用 shell 函数:

runmaybe () {
  if [[ $mode == "--simulate" ]]
  then echo $@
  else $@ 2>&1 > /dev/null
  fi
}

这是一个概念证明:

#!/bin/bash

filethatwillsavestderr="/tmp/foo"
filethatwillsavestdout="/tmp/bar"

mode="--simulate" #switch this to another mode to see the effect

runmaybe () {
  if [[ $mode == "--simulate" ]]
  then echo "I should run '$@' but i'm not really doing it"
  else $@ > $filethatwillsavestdout 2> $filethatwillsavestderr
  fi
}

runmaybe ls

相关内容