管道多个命令进行bash,管道行为问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了管道多个命令进行bash,管道行为问题相关的知识,希望对你有一定的参考价值。

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

[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'的stdout被发送到管道。
  3. bash在stdin上收到'test'。 echo $?返回1,这是当你运行没有args的test时会发生的事情。
  4. cat跑。 它正在将stdin复制到stdout。 stdout被发送到管道。
  5. bash会执行你输入的任何内容,但是stderr不会被打印到屏幕上(我们使用的是|,而不是|&)。

我有三个问题:

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

提示在哪里?

当cat之类的东西使用stdin时,只要shell运行,或者其他东西可以使用它,它是否需要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. 没有提示。从手册页: 交互式shell是在没有非选项参数的情况下启动的(除非指定了-s)并且没有-c选项,其标准输入和错误都连接到终端。如果bash是交互式的,PS1已设置且$ - 包括i。 因此管道不是交互式shell,因此没有提示。
  3. Stdin和stdout一次只能连接一件事。 cat将从运行它的进程中获取stdin(例如,您的交互式shell)并将其stdout通过管道发送到bash。如果您需要多个东西能够提交到该cat的标准输入,请考虑使用命名管道。

这涵盖了吗?

以上是关于管道多个命令进行bash,管道行为问题的主要内容,如果未能解决你的问题,请参考以下文章

Linux shell Bash的基本功能3 多命令与管道符

可能的竞争条件,来自多个 tee 接收者的管道输出在 BASH 脚本中的命名管道上无序到达

多个 scikit 学习管道的奇怪行为

开始使用时 echo -n 命令的有趣行为

管道输出到 bash 命令的中间

读取管道后的bash返回码