用管道将多个命令传递给bash,管道行为问题

时间:2018-09-04 01:31:40

标签: bash pipe stdin cat tty

我在理解该命令序列时遇到困难:

[me@mine ~]$ (echo 'test'; cat) | bash
echo $?
1
echo 'this is the new shell'
this is the new shell
exit

[me@mine ~]$ 

据我了解,这是发生了什么

  1. 已创建管道。
  2. echo 'test'
  3. stdout发送到管道。
  4. bash在stdin上接受“测试”。
    • echo $?返回1,这是在运行不带参数的test时发生的情况。
  5. cat运行。
    • 它正在将stdin复制到stdout。
    • stdout发送到管道。
  6. bash将执行您键入的任何内容,但stderr不会显示在屏幕上(我们使用|,而不是|&)。

我有三个问题:

看起来,即使我们运行两个命令,两个命令也使用相同的管道和bash进程。是这样吗

提示在哪里?

当诸如cat之类的东西使用stdin时,只要shell运行它就获得stdin的专有所有权,还是其他东西可以使用它?

我怀疑我缺少ttys的一些细节,但是我不确定。任何帮助或详细信息或man摘录均表示感谢!

1 个答案:

答案 0 :(得分:1)

所以...

  1. 是的,有一个管道将命令发送到bash的单个实例。注意:

    $ echo 'date "+%T hello $$"; sleep 1; date "+%T world $$"' | bash
    22:18:52 hello 72628
    22:18:53 world 72628
    
  2. 没有提示。在手册页中:

      

    交互式shell是一个启动时启动的,它没有非选项参数(除非指定了-s),并且没有-c选项,其标准输入和错误都连接到了终端。如果bash是交互式的,则设置PS1,并且$-包含 i

    因此,管道不是交互式外壳,因此没有提示。

  3. Stdin和stdout一次只能连接到一件事。 cat将从运行它的进程(例如,您的交互式shell)中获取stdin,并将其stdout通过管道发送到bash。如果您需要多种内容才能提交给该cat的标准输入,请考虑使用命名管道。

可以解决吗?