shell - Linux:关于标准输出的疑问?
伊谢尔伦
伊谢尔伦 2017-04-17 14:35:02
[Linux讨论组]

创建文件xxxx,文件内容为字符串"Hello World"

[root@localhost ~]# cat xxxx // 从文件获取标准输入
Hello World
[root@localhost ~]# cat < xxxx // 从文件获取标准输入
Hello World
[root@localhost ~]# cat // 发生阻塞,从键盘获取标准输入
Hello World
Hello World

但为什么使用tee时会阻塞呢?

[root@localhost ~]# tee xxxx // 发生阻塞
[root@localhost home]# tee < xxxx // 从文件获取标准输入
Hello World

1、cat xxxx、cat < xxxx两种方式有什么区别吗?

2、预期效果是将xxxx的内容作为标准输入传给tee,再通过标准输出显示出来,但却发生了阻塞,通过man cat、man tee没看出为什么会产生这样的差别。

cat:连接stdin内容输出到stdout
tee:读取stdin内容输出到stdout

两个小疑惑:)

伊谢尔伦
伊谢尔伦

小伙看你根骨奇佳,潜力无限,来学PHP伐。

全部回复(4)
高洛峰

你对tee xxxx的理解

预期效果是将xxxx的内容作为标准输入传给tee,再通过标准输出显示出来

是错误的


cat xxxx 是cat程序自身读取xxxx文件,输出到stdout,这个过程跟stdin没有一点关系
cat < xxxx cat命令没加任何参数,此时cat会读取stdin,而此时shell通过<符号将stdin重定向到文件xxxx,相当于cat间接读取了xxxx,但是cat并不能感知到xxxx文件的存在

tee xxxx 是tee读取stdin,输出到stdout以及xxxx文件, 这一点跟cat是有区别的

而你查到的命令解释太笼统了

  • cat是读取stdin或者用参数指定的文件(一个或者多个),并输出到stdout

  • tee是读取stdin,并输出到stdout以及用参数指定的文件(零个、一个或者多个)

单独使用不加参数的cat或者tee,可以认为没有区别

天蓬老师

cat的man page里这样写的:

cat [OPTION]... [FILE]...

很明显cat xxx中的xxx是一个参数,而不是从标准输入中读取。

天蓬老师

1.没有区别。

2.通过管道连接符|来传递输出就可以了,比如:cat test.txt | tee copy1.txt copy2.txt

之所以会发生阻塞,是因为tee test.txtcat命令都期望读取标准输入,一直读到EOF才会退出。Ctrl + D可以模拟从终端发送EOF,程序就会正常结束。

天蓬老师

请仔细阅读man page

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号