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)
更一般地,命令替换会转义字符> >> & | # $
和其他可能的字符。如何在不使用命令替换进行转义的情况下输出这些符号?
替换发生后(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)