#!/bin/bash
echo 'This comes before the "cat" line'
cat
echo 'This comes after the "cat" line'
以下是执行问题中给出的命令时的输出。
user20server:~/temp$ cat
^C
user20server:~/temp$ cat cat.sh
#!/bin/bash
echo 'This comes before the "cat" line'
cat
echo 'This comes after the "cat" line'
user20server:~/temp$ cat cat.sh | bash
This comes before the "cat" line
echo 'This comes after the "cat" line'
user20server:~/temp$ ./cat.sh
This comes before the "cat" line
^C
user20server:~/temp$
bash从管道读取并执行第二行。此行如下所示。这将输出This comes before the "cat" line。
echo 'This comes before the "cat" line'
bash读取并从管道执行第三行。此行如下所示。该cat命令读取管道的剩余内容。这将输出echo 'This comes after the "cat" line'。
cat
由于管道现在是空的,因此完成cat之后就会完成bash。
下面是两个示例,其中cat.sh脚本为命令提供了输入cat,因此不需要用户输入。
user20server:~/temp$ echo 'This is the output from the "cat" line.' | ./cat.sh
This comes before the "cat" line
This is the output from the "cat" line.
This comes after the "cat" line
user20server:~/temp$ ./cat.sh <<< 'This is the output from the "cat" line.'
This comes before the "cat" line
This is the output from the "cat" line.
This comes after the "cat" line
user20server:~/temp$
shell 不会停止;它已成功运行
cat
并正在等待它退出。当没有任何输入文件运行时,将从继承自其父进程的stdin
cat
(标准输入)读取。在第一个示例中(无论是直接运行还是通过 运行), 的 stdin都是从交互式 shell 继承的,因此它连接到终端。cat.sh
cat
也就是说,它
cat
只是看起来挂起了,但实际上它正在从你的键盘读取直到 EOF(即在一行的开头或在另一个 Ctrl-D 之后的 Ctrl-D)... 或者直到被 Ctrl-C 终止。在第二个示例中,
cat
运行的第二个进程|bash
也从其父进程继承了 stdin - 但在这种情况下,该 'bash' 进程的 stdin 是一个管道(从第一个进程接收数据cat cat.sh
),因此第二个进程cat
也从同一管道读取。 (所有数据已被 bash 读取,cat 无需读取任何数据。)此答案旨在进一步阐明grawity_u1686发布的答案。这可以通过将命令更改为以下内容来完成。
cat.sh
以下是执行问题中给出的命令时的输出。
下面解释了执行 的输出
cat cat.sh | bash
。 在 的内容cat.sh
开始写入管道后,以下内容完成。bash
应使用。此行显示如下。bash
从管道读取并执行第二行。此行如下所示。这将输出This comes before the "cat" line
。bash
读取并从管道执行第三行。此行如下所示。该cat
命令读取管道的剩余内容。这将输出echo 'This comes after the "cat" line'
。cat
之后就会完成bash
。下面是两个示例,其中
cat.sh
脚本为命令提供了输入cat
,因此不需要用户输入。