bash在一个命令中获取wc-l编号并显示?

bash在一个命令中获取wc-l编号并显示?,bash,count,lines,tee,wc,Bash,Count,Lines,Tee,Wc,我很确定这是显而易见的,但目前我正在这样做: count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | wc -l` 这让我得到了我想要的号码,但屏幕上什么都不显示(尽管我无论如何都会扔掉错误行) 在一个命令中显示控制台的输出时,有没有一种方法可以做到这一点(将wc-l count获取为count变量)?我很确定像tee这样的东西可以在这里使用,但我的大脑没有正常工作 否则,我想使用tee和cat将临时文件和控制台写回w

我很确定这是显而易见的,但目前我正在这样做:

count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | wc -l`
这让我得到了我想要的号码,但屏幕上什么都不显示(尽管我无论如何都会扔掉错误行)

在一个命令中显示控制台的输出时,有没有一种方法可以做到这一点(将wc-l count获取为count变量)?我很确定像
tee
这样的东西可以在这里使用,但我的大脑没有正常工作

否则,我想使用
tee
cat
将临时文件和控制台写回
wc
会有效,但我确信一定有一种更优雅的方法可以做到这一点

编辑:对不起,问题似乎不清楚。我不想在屏幕上显示计数,我想显示我一直在计数的输出,即:问题更新后,查找更新的输出

unset x
echo ${x:="$(find $dir -type f \( -perm -007 \) -print 2>/dev/null | wc -l)"}
echo $x
输出

16
16

啊,那么您想打印正常输出,并在
$count
中获得匹配数

试试这个:

count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | tee /dev/tty | wc -l`

我不确定我是否完全理解,因为find命令在编写时不需要括号,也不应该产生任何错误,我不知道您是否需要将输出转到stdout,或者您是否只想看到它工作,在这种情况下stderr也可以工作。我会这样做:

count=`find $dir -type f -perm -007 -print -fprint /dev/stderr | wc -l`

这是你澄清问题的答案。这会将计数放入变量$count中,并显示find的输出:

found=$(find $dir type f \( -perm -007 \) -print 2>/dev/null)
count=$(echo -e "$found" | wc -l)
echo -e "$found"

好的,那么更新后的问题的答案是什么

tty方法很好,但将故障转移到非终端(例如ssh localhost'echo hello>/dev/tty'失败)

可能只是

count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | tee >(cat >&2) | wc -l`
这相当于

count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | tee /proc/self/fd/2 | wc -l`
如果您不想/不能在此处使用stderror(fd 2)作为侧通道,则可以打开原始stdout的副本并参考它:

exec 3>&1
count=`find $dir -type f \( -perm -007 \) -print 2>/dev/null | tee /proc/self/fd/3 | wc -l`

$0.02

如果将find命令的stdout输入stderr(此处通过匿名fifo),则可以打印find to screen的输出

如果文件名或路径中嵌入了换行符,则计数将出错。因此,使用find的-print0功能,然后使用tr命令删除所有而不是'\0'的字节,最后只使用wc命令在最后计算'\0'字节

# show output of find to screen
count=`find . -type f \( -perm -007 \) -print0 2>/dev/null | tee >(tr '\0' '\n' > /dev/stderr) | tr -dc '\0' |  wc -c`
echo "$count"

# show output of count to screen
count=`find . -type f \( -perm -007 \) -print0 2>/dev/null | tee >(tr -dc '\0' | wc -c > /dev/stderr) | tr -dc '\0' |  wc -c`
echo "$count"

@保罗:真的。。。我认为问题是在显示变量时设置变量;但是我更新了非常明显的答案:)为什么这两张选票都没有回答问题呢?Sirex希望它输出find的结果,而不是count。事实上,现在我正在放弃权限拒绝错误,当它不是以root身份运行时,有时会发生这种错误,至少我认为我是:)啊。我的最终结果将是仍然显示权限被拒绝的错误,然后。哦,好吧。
tee/dev/tty
应该能回答你的最新问题。Sirex想看到的是find的输出,而不是计数。@David Conrad:这就是它的作用。对不起,你一定是在我评论它的时候编辑的。我的评论适用于早期版本。@Sirex:来得容易,去得容易;)我喜欢这个。我试图记住如何打开现有文件句柄的副本,但记不起来了。