C 如何引导gnu readline远离标准输出

C 如何引导gnu readline远离标准输出,c,stdin,gnu,readline,getline,C,Stdin,Gnu,Readline,Getline,所以我想制作一个程序,通过重定向或交互式输入从stdin接受输入getline可以实现重新定向读取,但我想为交互式输入提供readline的所有优秀功能。该程序的目的是通过一种语言处理文本,并将结果输出到标准输出(类似于sed所做的)。问题是,我无法使用readline执行my_prog>output.txt,因为任何输入到readline的内容都会进入该文件,而我甚至看不到它。目前,我有一个解决方案,我只需使用rl_outstream将readline的输出发送到stderr。这给了我想要的行

所以我想制作一个程序,通过重定向或交互式输入从stdin接受输入
getline
可以实现重新定向读取,但我想为交互式输入提供
readline
的所有优秀功能。该程序的目的是通过一种语言处理文本,并将结果输出到标准输出(类似于sed所做的)。问题是,我无法使用
readline
执行
my_prog>output.txt
,因为任何输入到
readline
的内容都会进入该文件,而我甚至看不到它。目前,我有一个解决方案,我只需使用
rl_outstream
readline
的输出发送到
stderr
。这给了我想要的行为,但当可能有更直接的解决方案时,感觉像是一个黑客。我正在寻找的一个很好的例子是python的功能

python>output.txt
>>>打印“你好”
>>>退出()
cat output.txt
你好
这里有一些代码来演示我在做什么

#包括
#包括
#包括
#包括“readline/readline.h”
int main(int argc,字符**argv)
{
char*from_stdin=malloc(512);
char*line=NULL;
rl_外流=标准流量;
如果(isatty(标准文件号)){
做{
行=读行(“”);
如果(行){
strcat(来自标准线路);
strcat(来自标准文本,“\n”);
}否则{
打破
}
}而(1),;
}否则{
尺寸n=0;
while(getline(&line,&n,stdin)!=-1)
strcat(来自标准线路);
}
看跌期权(来自标准股票);
}
可接受解决方案的修补程序:

--rl_outstream=stderr;
++文件*more_hacky=fopen(“/dev/tty”,“w”);
++rl_outstream=更粗;

我同意这是一种更为粗俗的说法。我可能会让我的代码保持原样,但如果我愿意的话,这会让stderr对于错误更加“纯粹”。

为了它的价值,CPython使用
stderr\u FILENO
作为Readline iff
的输出文件描述符!isatty(STDOUT\u FILENO)
您可以使用
strace
等工具验证这一事实

如果没有重定向,我们将得到

% strace -o strace.out python3 && grep '>>>' strace.out
Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> ^D
write(1, ">>> ", 4)                     = 4
还有重定向

% strace -o strace.out python3 > python.out && grep '>>>' strace.out
Python 3.6.7 (default, Oct 22 2018, 11:32:17) 
[GCC 8.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> ^D
write(2, ">>> ", 4)                     = 4


另一种选择是为输出流打开
/dev/tty
,但我觉得这会更多,而不是更少,hacky。

是的,我只是在玩它,看到如果我做
python>out.txt 2>err.txt
,所有python头信息和
>
都会转到err.txt。但是,我编写的代码会打印到终端,不会写入任何一个文件。bash(1)包含相同的代码--
rl_outstream=stderr,在其
bashline.c
函数
initialize\u readline
中。