Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash '';cat | tr<;文件1'';——为什么cat等待输入而不是从文件1读取?_Bash_Pipe_Stdin_Tr - Fatal编程技术网

Bash '';cat | tr<;文件1'';——为什么cat等待输入而不是从文件1读取?

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'

我正在重新创建从bash复制的自己的shell环境,我发现在真正的bash中有一个非常奇怪的行为:当我进入时

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
是否应该重定向到