我正在尝试制作一个C程序来选择选项。如果我这样运行它会起作用:
./select choice{1..5}
☐ choice1 ☐ choice3 ☐ choice5
☐ choice2 ☐ choice4
# outputs "choice1 choice2" on stdout
但如果我在反叛之间运行它,那就是地狱
`./select choice{1..5}` > choices.txt
☐ choice1☐ choice2☐ choice3☐ choice4☐ choice5
# Write "choice1 choice2" in `choices.txt`
我需要能够检索所选的选项。这就是我将所有输出完成到我用
打开的文件的原因int tty = open("/dev/tty", O_RDWR);
/* Do my program using outputs on fd `tty` */
printf("%s\n", get_results());
我认为这与我的代码中tgoto
的使用有关,可以在屏幕上移动写入光标。
if ((cm = tgetstr("cm", NULL)) == NULL)
return (-1);
tputs(tgoto(cm, x, y), fd, &my_putchar);
return (0);
我已经看到使用isatty(1)
在反引号之间执行时返回0,如果直接执行则返回1 ...那么,有没有办法让我移动光标并在两种情况下保持格式化? / p>
感谢您的时间
答案 0 :(得分:0)
问题中显示的代码片段使用 termcap 接口(不是 curses )。它使用
tputs(tgoto(cm, x, y), fd, &my_putchar);
my_putchar
可能会写入标准输出,就像程序的其余部分一样(使用 printf
)。如果程序被更改为将其所有屏幕输出写入标准错误,那么最后它可以将结果写入标准输出,从而简化脚本。
无需打开 /dev/tty
;而是,取代
printf("choice%d", n);
通过
fprintf(stderr, "choice%d", n);
当然将 my_putchar
更改为
int my_putchar(int c) { return fputc(c, stderr); }
是要走的路。
如果这是 curses 应用程序,则可以使用newterm
而不是initscr
来更改输出流。当然,dialog使用newterm
。