用例:
我正在编写一个脚本,该脚本将接受--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} command
to以避免控制台噪音时,我意识到这也会产生从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