ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

linux – Pipe Bash命令输出到stdout和变量

2019-10-02 04:50:25  阅读:315  来源: 互联网

标签:bash linux pipe stdout


我必须找到具有所选权限的文件并列出它们以及它们的编号.因此,我想将查找命令的结果传递给shell和下一个命令,我希望将哪个输出存储在一个变量中,以便以后可以很好地显示它.我想有类似的东西

for i in "$@"
do
    find $filename -perm $i | tee /dev/tty | var=${wc -l}
    echo "number of files with $i permission: $var"
done

但var = ${wc -l}部分不起作用.请帮忙.

编辑
我知道我可以把命令的整个输出放到一个变量上

var=$(find $filename -perm $i | tee /dev/tty | wc -l)

但后来我只需要wc -l的结果.我如何从该变量中获取此数字?是否有可能以相反的顺序显示它,先编号然后再列出清单?

解决方法:

复制到TTY(不是标准输出!)

管道组件在子shell中运行,因此即使它们确实分配了shell变量(并且其语法错误),一旦管道退出,这些shell变量就会被取消(因为子壳只有管道才会存在).

因此,您需要将整个管道的输出捕获到您的变量中:

var=$(find "$filename" -perm "$i" | tee /dev/tty | wc -l)

就个人而言,顺便说一句,我会向/ dev / stderr或/ dev / fd / 2发送电子邮件,以避免行为取决于TTY是否可用.

实际上管道到Stdout

使用bash 4.1,自动文件描述符分配允许您执行以下操作:

exec {stdout_copy}>&1 # make the FD named in "$stdout_copy" a copy of FD 1

# tee over to "/dev/fd/$stdout_copy"
var=$(find "$filename" -perm "$i" | tee /dev/fd/"$stdout_copy" | wc -l)

exec {stdout_copy}>&- # close that copy previously created
echo "Captured value of var: $var"

对于旧版本的bash,你需要自己分配一个FD – 在下面的例子中,我选择文件描述符号3(分别为stdin,stdout和stderr保留为0,1和2):

exec 3>&1  # make copy of stdout

# tee to that copy with FD 1 going to wc in the pipe
var=$(find "$filename" -perm "$i" | tee /dev/fd/3 | wc -l)

exec 3>&-  # close copy of stdout

标签:bash,linux,pipe,stdout
来源: https://codeday.me/bug/20191002/1841250.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有