【问题标题】:Piping multiple commands to bash, pipe behavior question管道多个命令到 bash,管道行为问题
【发布时间】:2018-09-04 01:31:40
【问题描述】:

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

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

我有三个问题:

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

提示在哪里?

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

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

【问题讨论】:

    标签: bash pipe stdin cat tty


    【解决方案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 选项其标准输入和错误都连接到终端。 PS1 已设置,如果 bash 是交互式的,则 $- 包括 i

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

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

    这包括它吗?

    【讨论】:

    • 这很有帮助 - 谢谢!特别感谢您对#3的回答,这有助于准确了解管道和标准输入/粗壮在这种情况下的工作方式。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-12-04
    • 2012-04-15
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2018-03-20
    • 1970-01-01
    相关资源
    最近更新 更多