管道多个命令来抨击,管道行为问题



我有这个命令序列,我很难理解:

[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在Stdin上接受"测试"。
    • echo $?返回 1,这是在没有 args 的情况下运行test时发生的情况。
  4. cat运行。
    • 它正在将标准复制到标准输出。
    • 标准输出被发送到管道。
  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 选项的情况下启动的,其标准输入和错误都连接到终端。PS1 已设置,如果 bash 是交互式的,则 $- 包括i

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

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

这能覆盖它吗?

相关内容

  • 没有找到相关文章

最新更新