复制到TTY(不是标准输出!)
管道组件在子外壳程序中运行,因此,即使它们确实分配了外壳程序变量(并且语法不正确),这些外壳程序变量也会在管道退出时立即取消设置(因为子外壳程序的寿命与管道程序一样长)。
因此,您需要将 整个管道 的输出捕获到变量中:
var=$(find "$filename" -perm "$i" | tee /dev/tty | wc -l)
就个人而言,顺便说一句,我是
tee荷兰国际集团,以
/dev/stderr或
/dev/fd/2避免决策行为依赖于TTY是否可用。
实际管道到标准输出
使用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 createdecho "Captured value of var: $var"对于较旧版本的bash,您需要自己分配FD-在以下示例中,我选择文件描述符编号3(因为0、1和2分别保留给stdin,stdout和stderr):
exec 3>&1 # make copy of stdout# tee to that copy with FD 1 going to wc in the pipevar=$(find "$filename" -perm "$i" | tee /dev/fd/3 | wc -l)exec 3>&- # close copy of stdout



