2016-06-07 101 views
1

在bash 1:为什么在写入命名管道时bash被关闭?

$ mkfifo /tmp/pipe 
$ echo 'something' > /tmp/pipe 

现在它挂起并等待要读取的数据。

在bash 2:

$ </tmp/pipe 

现在壳1消失,它是封闭的,我端走了。

为什么会发生这种情况?

在bash手册有被写入

的命令替换$(猫文件)可以通过 等效但速度更快$(<文件)来代替。

所以我在试验,如果普通的“<文件”以类似的方式工作到猫文件内容到终端。

$ bash --version | head -1 
GNU bash, version 4.3.11(1)-release (x86_64-pc-linux-gnu) 
$ cat /proc/version 
Linux version 3.16.0-71-generic ([email protected]) (gcc version 4.8.2 (Ubuntu 4.8.2-19ubuntu1)) #92~14.04.1-Ubuntu SMP Thu May 12 23:31:46 UTC 2016 

编辑

看到初步意见和答案后,我将添加一些说明。

我不关心不同的命令行语法。

但我后来真的是在阅读器外壳$ < /tmp/pipe情节编写器外壳退出,但与$ cat /tmp/pipe在阅读器外壳写入器外壳不会退出。为什么?

我看到我真的没有这个问题和身体的短语,应该可能会提出另一个问题?

+0

'$( chepner

回答

1

the pipe(7) manual page

如果指的是管道的读端所有文件描述符已被关闭,则write(2)将导致调用进程要产生的SIGPIPE信号。

会发生什么事是,当读数壳已完成读取和关闭其管道的末端,写作壳将接收SIGPIPE信号,如果不抓住它,则外壳将被终止。

+0

我不认为他们在问这个问题。我想他们问为什么它不输出任何东西,如果使用'<'而不是'cat'。 – 123

+0

@ 123问题标题“写入命名管道时为什么bash被关闭?”否则表示。 –

+0

在这种情况下,它是一个明显的重复,应标记为一个。 – 123

0

在手动标志$variable不是command prompt连接。

试试下面的脚本:

1)

#!/bin/bash 
echo $(< /tmp/pipe); 

2)

#!/bin/bash 
echo $(cat /tmp/pipe); 

两个正常工作。

+0

他没有输入'$',他只是将其显示为命令提示符。 – Barmar

+0

是的。我的意思是$( Daniel

+0

这与这个问题有什么关系,这就是为什么'echo something>/tmp/pipe '走了? – Barmar

0

当您键入< /tmp/pipe时,您将当前shell的标准输入连接到命名管道。 bash通过不断读取其输入并执行它读取的命令来工作。

  1. 在shell 1中,echo something > /tmp/pipe打开写入管道,写入字符串,然后阻塞,直到读取它为止。一旦echo完成,它将关闭管道的末端。
  2. < /tmp/pipe打开管道进行读取,并将其连接到外壳2的标准输入。
  3. Shell 2从管道读取(并尝试执行命令)。
  4. 返回到shell 1中,echo在第二个shell从管道读取后解除封锁,完成。管道的写入结束。
  5. 在管道的写入结束关闭的情况下,当shell 2尝试读取另一个命令时,将获得SIGPIPE,然后退出。

(另一种可能性是,外壳2退出时,如果命令它从管道读取并试图执行导致错误。)

$(< file),在另一方面,是命令替换的一种特殊情况。当bash看到时,它仅从file本身读取,而不是产生cat进程并捕获其输出。

+0

Writer shell(1)在完成write()时获取SIGPIPE。阅读器外壳(2)不会退出。 – Rax

相关问题