我正在尝试制作一个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("%sn", get_results());
我认为这与我的代码中的tgoto
使用有关,以在屏幕上移动写作光标。
if ((cm = tgetstr("cm", NULL)) == NULL)
return (-1);
tputs(tgoto(cm, x, y), fd, &my_putchar);
return (0);
我已经看到,使用isatty(1)
在Backticks之间执行时返回0,而1如果直接执行...因此,我是否有办法移动光标并将我的配置保持在两种情况下?
谢谢您的时间
问题中所示的代码片段是使用 Termcap 接口(不是 curses (。它使用
tputs(tgoto(cm, x, y), fd, &my_putchar);
其中 my_putchar
可能会写入标准输出,例如程序的其余部分(使用 printf
(。如果将程序更改为将其所有屏幕输出写入标准错误,那么最后,它可以将其 result 写入标准输出,简化脚本。p>无需打开 /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
更改输出流。对话框使用newterm
,当然。