将多个命令通过管道传输到 bash,管道行为问题
Piping multiple commands to bash, pipe behavior question
我无法理解这个命令序列:
[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 在标准输入上接收 'test'。
echo $?
returns 1,当你 运行 test
没有参数时会发生这种情况。
cat
运行秒。
- 正在将标准输入复制到标准输出。
- stdout 被发送到管道。
bash
将执行您输入的任何内容,但不会将 stderr 打印到屏幕上(我们使用 |
,而不是 |&
)。
我有三个问题:
看起来,即使我们 运行 两个命令,我们对两个命令使用相同的管道和 bash
进程。是这样吗?
提示去哪里了?
当像 cat 这样的东西使用 stdin 时,它是否只要 shell 运行s 就拥有 stdin 的独占所有权,还是其他东西可以使用它?
我怀疑我遗漏了一些有关 ttys 的细节,但我不确定。任何帮助或细节或 man
摘录表示赞赏!
所以...
是的,有一个管道将命令发送到 bash
的单个实例。注:
$ echo 'date "+%T hello $$"; sleep 1; date "+%T world $$"' | bash
22:18:52 hello 72628
22:18:53 world 72628
没有提示。来自手册页:
An interactive shell is one started without non-option arguments (unless -s is specified) and without the -c option whose standard input and error are both connected to terminals. PS1 is set and $- includes i if bash is interactive.
所以管道不是交互式的 shell,因此没有提示。
Stdin 和 stdout 一次只能连接一个东西。 cat
将从 运行 它的进程(例如,您的交互式 shell)获取标准输入,并通过管道将其标准输出发送到 bash
。如果您需要多个东西才能提交到 cat
的标准输入,请考虑使用命名管道。
这包括了吗?
我无法理解这个命令序列:
[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 在标准输入上接收 'test'。
echo $?
returns 1,当你 运行test
没有参数时会发生这种情况。
cat
运行秒。- 正在将标准输入复制到标准输出。
- stdout 被发送到管道。
bash
将执行您输入的任何内容,但不会将 stderr 打印到屏幕上(我们使用|
,而不是|&
)。
我有三个问题:
看起来,即使我们 运行 两个命令,我们对两个命令使用相同的管道和 bash
进程。是这样吗?
提示去哪里了?
当像 cat 这样的东西使用 stdin 时,它是否只要 shell 运行s 就拥有 stdin 的独占所有权,还是其他东西可以使用它?
我怀疑我遗漏了一些有关 ttys 的细节,但我不确定。任何帮助或细节或 man
摘录表示赞赏!
所以...
是的,有一个管道将命令发送到
bash
的单个实例。注:$ echo 'date "+%T hello $$"; sleep 1; date "+%T world $$"' | bash 22:18:52 hello 72628 22:18:53 world 72628
没有提示。来自手册页:
An interactive shell is one started without non-option arguments (unless -s is specified) and without the -c option whose standard input and error are both connected to terminals. PS1 is set and $- includes i if bash is interactive.
所以管道不是交互式的 shell,因此没有提示。
Stdin 和 stdout 一次只能连接一个东西。
cat
将从 运行 它的进程(例如,您的交互式 shell)获取标准输入,并通过管道将其标准输出发送到bash
。如果您需要多个东西才能提交到cat
的标准输入,请考虑使用命名管道。
这包括了吗?