我有这个命令序列,我很难理解:
[me@mine ~]$ (echo 'test'; cat) | bash
echo $?
1
echo 'this is the new shell'
this is the new shell
exit
[me@mine ~]$
据我了解,这是发生的事情:
- 将创建一个管道。
echo 'test'
的标准输出被发送到管道。- Bash在Stdin上接受"测试"。
echo $?
返回 1,这是在没有 args 的情况下运行test
时发生的情况。
cat
运行。- 它正在将标准复制到标准输出。
- 标准输出被发送到管道。
bash
将执行您键入的任何内容,但 stderr 不会打印到屏幕上(我们使用|
,而不是|&
(。
我有三个问题:
看起来,即使我们运行两个命令,我们也对两个命令使用相同的管道和bash
进程。是这样吗?
提示在哪里?
当像 cat 这样的东西使用 stdin,只要 shell 运行,它就会独占 stdin,还是其他东西可以使用它?
我怀疑我错过了 ttys 的一些细节,但我不确定。任何帮助或细节或man
摘录感谢!
所以...
-
是的,有一个管道将命令发送到
bash
的单个实例。注意:$ echo 'date "+%T hello $$"; sleep 1; date "+%T world $$"' | bash 22:18:52 hello 72628 22:18:53 world 72628
-
没有提示。从手册页:
交互式 shell 是在没有非选项参数(除非指定 -s (且没有 -c 选项的情况下启动的,其标准输入和错误都连接到终端。PS1 已设置,如果 bash 是交互式的,则 $- 包括i。
因此,管道不是交互式 shell,因此没有提示。
-
Stdin 和 stdout 一次只能连接到一个事物。
cat
将从运行它的进程(例如,您的交互式 shell(中获取 stdin,并通过管道将其 stdout 发送到bash
。如果您需要多个内容才能提交到该cat
的 stdin,请考虑使用命名管道。
这能覆盖它吗?