为什么 `reset` 命令包含延迟?

sou*_*edi 20 terminal

reset命令包括清除屏幕和返回之间的延迟。这甚至适用于最新的终端类型xterm-256color。为什么?

man reset没有提到延迟,只提到特殊字符串的打印。(它也没有提到清除屏幕。我假设这包含在终端初始化字符串下)。

我注意到以下输出strace -f reset

nanosleep({tv_sec=1, tv_nsec=0}, 0x7ffe1964f100) = 0
ioctl(2, SNDCTL_TMR_STOP or TCSETSW, {B38400 opost isig icanon echo ...}) = 0
Run Code Online (Sandbox Code Playgroud)

Tho*_*key 27

真正的(硬件)终端需要那个。例如,对于某些,重置它们的唯一方法是进行硬件重置。

它对终端模拟器无害,并且由于没有传统的方法来区分差异(并且很难确定某些转义序列是否可以进行硬件重置),因此reset假设您的终端是真实的。

时间延迟可以追溯到tset1979 年的 3BSD,如下所示:

    /* output startup string */
    if (!RepOnly && !NoInit)
    {
            bufp = buf;
            if (tgetstr("is", &bufp) != 0)
                    prs(buf);
            bufp = buf;
            if (tgetstr("if", &bufp) != 0)
                    cat(buf);
            sleep(1);       /* let terminal settle down */
    }
Run Code Online (Sandbox Code Playgroud)

它在 ncurses 中有所发展,但使用相同的准则:

        if (!noinit) {
            if (send_init_strings(my_fd, &oldmode)) {
                (void) putc('\r', stderr);
                (void) fflush(stderr);
                (void) napms(1000);         /* Settle the terminal. */
            }
        }
Run Code Online (Sandbox Code Playgroud)

进一步阅读:

  • @Mehrdad 你可以试试`tput reset`。它似乎没有使用延迟。 (7认同)
  • 当我们在这里时,您能否解释一下如何消除延迟(如果可能)? (3认同)
  • @Mehrdad `stty sane` 似乎解决了第一个条件,没有任何延迟。 (3认同)
  • ncurses 的版本(6.0)不会修改终端模式(如“reset”或“stty sane”所做的那样)。current ncurses "tput Reset" 会执行除延迟之外的所有操作。对于 OpenBSD...等待 10 年。 (2认同)
  • @Mehrdad 这对我来说效果很好: ~/.bashrc 中的 `alias reset='tput Reset'` (2认同)