Bash '';cat | tr<;文件1'';——为什么cat等待输入而不是从文件1读取?
我正在重新创建从bash复制的自己的shell环境,我发现在真正的bash中有一个非常奇怪的行为:当我进入时Bash '';cat | tr<;文件1'';——为什么cat等待输入而不是从文件1读取?,bash,pipe,stdin,tr,Bash,Pipe,Stdin,Tr,我正在重新创建从bash复制的自己的shell环境,我发现在真正的bash中有一个非常奇怪的行为:当我进入时 cat | tr -d 'o' < file1 (file1 contains only the text "Bonjour") cat | tr-d'o'
cat | tr -d 'o' < file1
(file1 contains only the text "Bonjour")
cat | tr-d'o'
它输出Bnjur
,因此在此之前没有问题,但在我按下enter键之前,它一直处于“等待输入”状态。起初我以为它是执行tr
后在stdin
上读取的cat
,但它的行为不同,它只是等待用户按enter键(显然)什么也不做。
我在一些bash文档中看到,您将输入从文件重定向到tr,cat本身没有输入,因此从stdin获取输入。试试这个
cat file1 | tr -d 'o'
您将输入从文件重定向到tr,cat本身没有输入,因此从stdin获取输入。试试这个
cat file1 | tr -d 'o'
重定向仅适用于tr
命令,而不适用于整个管道
因此,cat
正在读取连接到终端的原始标准输入。它挂起来是因为它在等你打字
同时,tr
正在从文件中读取。它在处理完文件后退出
键入内容后,cat
会将其写入管道。由于tr
已退出,管道上没有读卡器,因此cat
将收到SIGPIPE
信号并终止
如果要将重定向应用于cat
,请使用
cat < file1 | tr -d 'o'
cat
如果要将其应用于整个管道,可以将其分组到子shell中:
( cat | tr -d '0' ) < file1
(cat | tr-d'0')重定向仅适用于tr
命令,而不适用于整个管道
因此,cat
正在读取连接到终端的原始标准输入。它挂起来是因为它在等你打字
同时,tr
正在从文件中读取。它在处理完文件后退出
键入内容后,cat
会将其写入管道。由于tr
已退出,管道上没有读卡器,因此cat
将收到SIGPIPE
信号并终止
如果要将重定向应用于cat
,请使用
cat < file1 | tr -d 'o'
cat
如果要将其应用于整个管道,可以将其分组到子shell中:
( cat | tr -d '0' ) < file1
(cat | tr-d'0')
请尝试写一个标题,让人们知道具体的行为是什么,而无需点击并阅读正文。但基本上,每个进程只有一个stdin。当您给出两个相互冲突的规范时,只有一个会赢,并且处理是从左到右的,所以右边的那个就是赢家。您告诉tr
从cat
获取输入,但也要从file1
获取输入;这两种情况中只有一种可能发生,因为每个进程只有一个stdin。否,file1
没有被重定向到cat
tr
从file1
获取输入,cat
的输出无处可去,而cat
正在从tty读取输入。如果您想要请尝试写一个标题,让某人知道具体的行为,而无需点击并阅读正文。基本上,但是:每个进程只有一个stdin。当您给出两个相互冲突的规范时,只有一个会赢,并且处理是从左到右的,所以右边的那个就是赢家。您告诉tr
从cat
获取输入,但也要从file1
获取输入;这两种情况中只有一种可能发生,因为每个进程只有一个stdin。否,file1
没有被重定向到cat
tr
从file1
获取输入,cat
的输出无处可去,cat
正在从tty读取输入。如果您想要这并不能解释OP获得其原始行为的原因,这就是他们实际问的问题。谢谢你的回答,但我试图重现这种行为,而不是找到一种方法将输入重定向到catThis。这并不能解释OP为什么会得到他们原来的行为,这是他们实际问的问题。谢谢你的回答,但我试图重现这种行为,在分组示例中,没有找到将输入重定向到catParens而不是大括号的方法?@CharlesDuffy我最初使用大括号。但由于重定向和管道强制它在子进程中运行,我认为没有必要避免使用子shell。我讨厌额外的代码>你必须使用大括号,很容易忘记。这非常清楚,谢谢,但我还有一个问题:上面说,对于下面的A | B | C | D>outfileerrfile
,infle被重定向到第一个简单命令A
(第2页),那么,在我的示例中,我的file1
不应该被重定向到cat
而不是tr
?这不是标准shell命令的解析方式。那本教科书正在实现自己的shell.Parens,而不是分组示例中的大括号?@CharlesDuffy我最初使用大括号。但由于重定向和管道强制它在子进程中运行,我认为没有必要避免使用子shell。我讨厌额外的代码>你必须使用大括号,很容易忘记。这非常清楚,谢谢,但我还有一个问题:上面说,对于下面的A | B | C | D>outfileerrfile
,infle被重定向到第一个简单命令A
(第2页),那么我的file1
是否应该重定向到