如何在同一行将命令输出存入变量并重定向至文件?
如何在同一行命令中同时将输出存入变量并重定向到文件
我来帮你搞定这个问题!你遇到的情况是原命令的重定向逻辑没踩对,导致没法实现“同时存变量和文件”的需求,咱们一步步拆解清楚:
原命令的问题
你写的这条命令:
a=`cat /etc/redhat-release | awk '{print $2}' > /tmp/a.txt`
核心问题在于:重定向> /tmp/a.txt直接把awk的输出送到了文件里,而命令替换`...`捕获的是整个子shell的标准输出——但awk的输出已经被重定向走了,所以变量a会变成空字符串。如果你的/tmp/a.txt也没内容,大概率是命令执行时出了小问题(比如文件不存在、权限不足),但核心需求的实现逻辑本身就不对。
正确方案:用tee命令
tee命令的本职工作就是把输入同时输出到标准输出和指定文件,完美匹配你的需求:既让命令替换捕获标准输出赋值给变量,又把内容写入目标文件。
写法1(保留你的管道结构)
a=$(cat /etc/redhat-release | awk '{print $2}' | tee /tmp/a.txt)
写法2(更简洁,去掉多余的cat)
a=$(awk '{print $2}' /etc/redhat-release | tee /tmp/a.txt)
执行完这条命令后:
- 输入
echo $a能看到提取出的版本号 - 输入
cat /tmp/a.txt也会看到完全相同的内容
替代方案(不用tee,一行完成)
如果你不想用tee,也可以先把输出存到变量,再把变量写入文件,用分号分隔成一行命令:
a=$(awk '{print $2}' /etc/redhat-release); echo "$a" > /tmp/a.txt
不过这个方法会执行两次输出操作,效率不如tee高。
内容的提问来源于stack exchange,提问作者Manoj.V
相关产品推荐
相关产品推荐

