有时我看到当一个程序(比如A
)在前台运行并将其输出打印到标准输出时,我可以键入另一个命令(比如B
),当我按下它时,它就会运行,即使从那时起Enter我就没有被提示输入B
A
有还没有执行完。我可以在 tcsh shell 中执行此操作,最终结果是B
在A
.
这个功能叫什么?这个shell有具体的吗?如果我不在提示符下输入命令,它是如何工作的?
答案1
这就是所谓的预先输入,并且它不是特定于 shell 的。您输入的内容最终会在终端中缓冲,下次在终端中运行的程序准备好输入时,它会读取缓冲区中等待的内容。在您的示例中,该程序是 shell,因此它会执行您键入的命令,就好像您A
在键入命令之前等待完成一样。
有些程序会在接受输入之前显式清除缓冲区;例如,大多数要求输入密码的程序都会清除缓冲区,以确保用户知道输入的内容(因为输入不会回显)。
答案2
听起来你所描述的实际上是程序A在后台运行。即使进程在后台运行,它仍然可以打印到终端。
bash 示例:
#----background_program----#
#!/bin/bash
for ((i=0;i<=10;i++)); do
echo "$i"
sleep 5
done
exit 0
您可以在后台运行它,查看其输出在您的终端上弹出。在第一条输出消息之后,您的光标将从提示中移出。然后,您可以在background_program
仍在执行的同时在前台执行其他命令:
./background_program & # '&' to put in background
echo "wut"
echo "foo"
echo "bar"
这会给你类似的东西:
sandbox@Dionysus:~$ ./background_program &
[1] 6197
sandbox@Dionysus:~$ 0
echo "wut"
wut
sandbox@Dionysus:~$ 1
echo "foo"
foo
sandbox@Dionysus:~$ 2
echo "bar"
bar
sandbox@Dionysus:~$ 3
4
5
6
7
8
9
10
我在 gnome 终端中执行了此操作,但我认为这种行为并不罕见。
如果你要在前台执行你的程序 A,你就会得到 @Stephen 所说的,typeahead。当您的命令加载到缓冲区中并在程序 A 完成后进行解释时,该程序不会执行。