是什么允许在上一个命令仍在前台运行时键入命令?

是什么允许在上一个命令仍在前台运行时键入命令?

有时我看到当一个程序(比如A)在前台运行并将其输出打印到标准输出时,我可以键入另一个命令(比如B),当我按下它时,它就会运行,即使从那时起Enter我就没有被提示输入BA有还没有执行完。我可以在 tcsh shell 中执行此操作,最终结果是BA.

这个功能叫什么?这个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 完成后进行解释时,该程序不会执行。

相关内容