如何防止 bash 命令替换输出被转义?

asm*_*ean 6 bash shell-script command-substitution

我试图在 bash 脚本中使用命令替换来输出基于变量的重定向符号,如下所示:

IS_VERBOSE=false
curl $BLAH $( $IS_VERBOSE && echo '-i' || echo '> /dev/null' )
Run Code Online (Sandbox Code Playgroud)

也就是说,如果冗长,请添加-i开关,否则,将 stdout 中的所有内容都扔掉。问题是当IS_VERBOSE为假时,我的命令变成

curl $BLAH \> /dev/null
Run Code Online (Sandbox Code Playgroud)

更一般地,命令替换会转义字符> >> & | # $和其他可能的字符。如何在不使用命令替换进行转义的情况下输出这些符号?

phk*_*phk 5

替换发生后(POSIX 中的 BTW 只能在任何“>”之前定位左侧),不再评估是否有“>”,因此您设想的方法将不起作用。

如果您不关心 POSIX 一致性(毕竟您将其标记为“bash”),您仍然可以通过动态设置右侧来找到解决方案,但我个人会采用完全不同的方法;查看以下帖子,详细介绍了基于自定义文件描述符的详细/静默模式:https : //stackoverflow.com/a/20942015/2261442

从那篇文章中摘录一段代码来展示它看起来有多好:

# Some confirmations:
printf "%s\n" "This message is seen at verbosity level 3 and above." >&3
printf "%s\n" "This message is seen at verbosity level 4 and above." >&4
printf "%s\n" "This message is seen at verbosity level 5 and above." >&5
Run Code Online (Sandbox Code Playgroud)