如何在重定向输出的文件名中使用代码块内的变量?
问题原因分析
第一个脚本失效原因
Bash在执行命令前会优先解析所有重定向表达式,再执行命令块内的代码。所以>> output-$v.log中的$v会在命令块执行前就被展开,此时变量v还未赋值,最终生成空文件名的output-.log。
第二个脚本失效原因
添加分号后,{...};是一个独立执行的命令块,变量v在命令块执行完成后被赋值为1。但后面的>> output-$v.log是对空命令的重定向,空命令没有任何输出,所以生成的output-1.log内容为空。
解决方案
要实现“用命令块内的变量值命名输出文件,同时捕获命令块输出”,可以在命令块内部通过exec动态设置重定向,这样变量赋值完成后再指定输出文件:
{ v=1 # 从这一行开始,将标准输出和错误重定向到目标文件 exec >> output-$v.log 2>&1 echo $v # 后续所有命令的输出都会写入该文件 echo "更多内容" }
执行后会生成output-1.log,文件内容为:
1 更多内容
内容的提问来源于stack exchange,提问作者Saaru Lindestøkke
相关产品推荐
相关产品推荐

