【问题标题】:How to control input echoing in non-interactive mode with readline 8.2?如何使用 readline 8.2 在非交互模式下控制输入回显?
【发布时间】:2023-02-02 23:00:44
【问题描述】:

作为学校项目的一部分,我们必须编写一个简化的 shell 并被指示模仿 Bash 的行为。 在尝试了解如何使简化的 shell 在非交互模式下工作时,我注意到两个问题:

  1. readline 将输入回显到 stdout,无论 stdin、stdout 或 stderr 是否连接到终端
  2. 当 stdout 或 stderr 都没有连接到终端时,您看不到您正在输入的内容。

    我需要的是:

    • 当您从终端输入时,您需要查看您输入的内容,即使 stdout 和 stderr 被重定向到终端之外。
    • 从文件获取输入时,输入文件的内容不应回显到 stdout 或 stderr。

    我在这里 (Why does readline() echo stdin to stdout?) 看到您可以使用 rl_outstream 变量配置此行为,但这似乎还不够。 在非交互模式下,我需要完全禁用输入回显。但是设置 rl_outstream = NULL 只会让它回显到标准输出。

    这是显示我的问题的代码:

    #include <stdio.h>
    #include <readline/readline.h>
    #include <readline/history.h>
    #include <stdlib.h>
    #include <unistd.h>
    
    int main()
    {
        char    *line;
    
        if (isatty(2))
            rl_outstream = stderr;
    
        while (1)
        {
            if (isatty(0) && isatty(2))
                line = readline("prompt> ");
            else
                line = readline("");
            if (!line)
                break ;
            free(line);
        }
        return (0);
    }
    

    确保使用 readline 8.2.1 进行编译,因为此代码的行为似乎与旧版本的 readline 不同。

    当运行./a.out &gt;out./a.out 2&gt;err 时,我得到了我想要的结果。 我的问题是以下情况:

    ./a.out &gt;out 2&gt;err 问题:看不到你输入的内容

    ./a.out &lt;infile 问题:输入回显到 stderr

【问题讨论】:

  • 您链接的问题表明 readline() 不适合非交互式使用。

标签: c bash readline


【解决方案1】:

框架挑战:

The Bash manual page 对 readline 有这样的说法:

这是处理读取输入的库使用交互式 shell 时,除非在 shell 调用时给出了 --noediting 选项。当使用 read 内置的 -e 选项时,也使用行编辑。

(强调)

那么我们可以得出结论,Bash 本身在作为非交互式 shell 运行时不使用 readline。您甚至可以禁用交互式 Bash 的 readline。

因此,您也应该考虑在这方面模拟 Bash,而不是努力让 readline 在非交互式情况下按照您想要的方式工作,只是在那种情况下不要使用它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-28
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多