【发布时间】:2023-02-02 23:00:44
【问题描述】:
作为学校项目的一部分,我们必须编写一个简化的 shell 并被指示模仿 Bash 的行为。 在尝试了解如何使简化的 shell 在非交互模式下工作时,我注意到两个问题:
- readline 将输入回显到 stdout,无论 stdin、stdout 或 stderr 是否连接到终端
- 当 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 >out或./a.out 2>err时,我得到了我想要的结果。 我的问题是以下情况:./a.out >out 2>err问题:看不到你输入的内容./a.out <infile问题:输入回显到 stderr
【问题讨论】:
-
您链接的问题表明
readline()不适合非交互式使用。