我必须找到具有所选权限的文件并列出它们以及它们的编号.因此,我想将查找命令的结果传递给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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。