创建文件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
两个小疑惑:)
你对
tee xxxx
的理解是错误的
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 xxx
中的xxx是一个参数,而不是从标准输入中读取。1.没有区别。
2.通过管道连接符
|
来传递输出就可以了,比如:cat test.txt | tee copy1.txt copy2.txt
之所以会发生阻塞,是因为
tee test.txt
和cat
命令都期望读取标准输入,一直读到EOF才会退出。Ctrl + D
可以模拟从终端发送EOF,程序就会正常结束。请仔细阅读man page