将多个命令通过管道传输到 bash,管道行为问题

Piping multiple commands to bash, pipe behavior question

我无法理解这个命令序列:

[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. bash 在标准输入上接收 'test'。
    • echo $? returns 1,当你 运行 test 没有参数时会发生这种情况。
  4. cat运行秒。
    • 正在将标准输入复制到标准输出。
    • stdout 被发送到管道。
  5. bash 将执行您输入的任何内容,但不会将 stderr 打印到屏幕上(我们使用 |,而不是 |&)。

我有三个问题:

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

提示去哪里了?

当像 cat 这样的东西使用 stdin 时,它是否只要 shell 运行s 就拥有 stdin 的独占所有权,还是其他东西可以使用它?

我怀疑我遗漏了一些有关 ttys 的细节,但我不确定。任何帮助或细节或 man 摘录表示赞赏!

所以...

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

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

    An interactive shell is one started without non-option arguments (unless -s is specified) and without the -c option whose standard input and error are both connected to terminals. PS1 is set and $- includes i if bash is interactive.

    所以管道不是交互式的 shell,因此没有提示。

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

这包括了吗?