首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何将Bash命令的输出存储在>()中的变量中?

如何将Bash命令的输出存储在>()中的变量中?
EN

Stack Overflow用户
提问于 2013-05-10 09:24:57
回答 4查看 715关注 0票数 2

我有这个:

代码语言:javascript
复制
tee < /some/big/file >(wc -c) >(md5sum) | ...

我不想将wc -cmd5sum的结果写到标准输出中,而是希望将结果存储到两个变量中,以便以后处理。我不想多次读取该文件。我如何才能做到这一点?

EN

Stack Overflow用户

发布于 2013-05-10 09:45:27

这并不能直接回答你的问题...但您只需读取该文件一次,并且不必使用tee

代码语言:javascript
复制
SIZE=$(wc -c /some/big/file)
MD5=$(md5 /some/big/file)

那么,这会读取文件多少次呢?一次。这是因为wc -c实际上并不读取文件,它只是查看文件有多长并返回报告。以下是我的测试:

代码语言:javascript
复制
$ time wc -c /big/file >/dev/null
real    0m0.003s
user    0m0.000s
sys     0m0.000s
$ time wc -c </big/file >/dev/null
real    0m0.004s
user    0m0.000s
sys     0m0.000s
$ time cat /big/file | wc -c >/dev/null
real    0m52.945s
user    0m0.160s
sys     0m19.612s

教训:不要将tee (或cat)与wc -c混为一谈,因为这非常浪费时间。只要正常执行md5就行了,不用担心wc -c

注意:wc -c <file速度快的原因是它获得了一个普通的文件句柄,就像wc自己调用了open()一样。

管道性能

您几乎不应该在管道中使用cat

代码语言:javascript
复制
cat file | cmd    # slow
cmd <file         # fast

调用cat通常意味着创建一个没有任何用途的额外进程。在某些情况下,就像使用wc -c一样,它实际上会在管道之后减慢程序的运行速度。我的意思是,你可以把cat放在你喜欢的任何地方,但这太愚蠢了:

代码语言:javascript
复制
echo 'hello, world' | cat
cat file.txt | less
cat file.txt | cat | less
cat file.txt | cat | sort | cat | cat | uniq | cat >file_unique.txt

这样更好:

代码语言:javascript
复制
echo 'hello, world'
less file.txt
sort file.txt | uniq >file_unique.txt
票数 1
EN
查看全部 4 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16473767

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档