我在理解该命令序列时遇到困难:
[me@mine ~]$ (echo 'test'; cat) | bash
echo $?
1
echo 'this is the new shell'
this is the new shell
exit
[me@mine ~]$
据我了解,这是发生了什么
echo 'test'
的echo $?
返回1,这是在运行不带参数的test
时发生的情况。 cat
运行。
bash
将执行您键入的任何内容,但stderr不会显示在屏幕上(我们使用|
,而不是|&
)。 我有三个问题:
看起来,即使我们运行两个命令,两个命令也使用相同的管道和bash
进程。是这样吗
提示在哪里?
当诸如cat之类的东西使用stdin时,只要shell运行它就获得stdin的专有所有权,还是其他东西可以使用它?
我怀疑我缺少ttys的一些细节,但是我不确定。任何帮助或详细信息或man
摘录均表示感谢!
答案 0 :(得分:1)
所以...
是的,有一个管道将命令发送到bash
的单个实例。注意:
$ echo 'date "+%T hello $$"; sleep 1; date "+%T world $$"' | bash
22:18:52 hello 72628
22:18:53 world 72628
没有提示。在手册页中:
交互式shell是一个启动时启动的,它没有非选项参数(除非指定了-s),并且没有-c选项,其标准输入和错误都连接到了终端。如果bash是交互式的,则设置PS1,并且$-包含 i 。
因此,管道不是交互式外壳,因此没有提示。
Stdin和stdout一次只能连接到一件事。 cat
将从运行它的进程(例如,您的交互式shell)中获取stdin,并将其stdout通过管道发送到bash
。如果您需要多种内容才能提交给该cat
的标准输入,请考虑使用命名管道。
可以解决吗?