首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"cat a\ cat b“忽略了

"cat a\ cat b“忽略了
EN

Stack Overflow用户
提问于 2016-07-08 19:23:47
回答 3查看 163关注 0票数 0

管道的正式定义是左文件的STDOUT将立即管道到右侧文件的STDIN,我有两个文件,hello.txthuman.txtcat hello.txt返回Hellocat human.txt返回I am human.Now,如果我做了cat hello.txt | cat human.txt,难道不应该返回Hello I am human吗?相反,我看到command not found.I新来shell scripting.Can,有人解释了吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-07-08 19:29:50

背景:管道安排左边命令的输出(即写入FD 1的内容,stdout)作为输入到右边的命令( FD 0,stdin)。它通过将进程连接到“管道”或FIFO,并同时执行它们来做到这一点;尝试从FIFO读取进程将等待到另一个进程写了什么,而向FIFO写入的尝试将等到另一个进程准备好读取为止。

代码语言:javascript
复制
cat hello.txt | cat human.txt

...feeds将hello.txt的内容写入cat human.txt的stdin中,但cat human.txt并不是从stdin读取;而是由命令行参数指示只从human.txt读取。

因此,cat human.txt的stdin上的内容将被忽略,永远不会读取,cat hello.txtcat human.txt退出时接收到SIGPIPE,之后也会退出。

代码语言:javascript
复制
cat hello.txt | cat - human.txt

...by对比将首先从stdin读取第二个cat (您还可以在许多操作系统(包括Linux)上使用/dev/stdin代替- ),然后从文件中读取。

票数 8
EN

Stack Overflow用户

发布于 2016-07-08 19:27:04

您不需要输送它们,而是可以从多个文件中读取,如下所示,这将反过来连接两个文件内容的内容。

代码语言:javascript
复制
cat hello.txt human.txt

|通常用于将第一个命令的输出输入到管道中的第二个命令。在本例中,具体而言,您的第二个命令是从文件中读取,因此不需要使用管道。如果你愿意,你可以像

代码语言:javascript
复制
echo "Hello" | cat - human.txt
票数 0
EN

Stack Overflow用户

发布于 2016-07-08 20:02:37

首先,命令将不会出现错误,它将打印i,即human.txt的内容。

是的,你对管道的定义是正确的,但是在管道的右边应该有一些命令。如果该命令用于接收输入并提供输出,而不是提供输出,则该命令将执行自己的行为。

但是这里有一个命令,即右边的cat human.txt,但是它会打印自己的内容,并且不会对接收到的输入进行操作。

而且,当您编写类似cat的hello.txt / human.txt bash时,会出现此错误: human.txt: human.txt:命令未找到

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38274012

复制
相关文章

相似问题

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