gpt4 book ai didi

c - 在反引号之间执行的程序的 termcap

转载 作者:行者123 更新时间:2023-11-30 16:44:06 26 4
gpt4 key购买 nike

我正在尝试编写一个 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...那么,有没有办法让我移动光标并保持我的光标不变?在这两种情况下都格式化吗?

感谢您的宝贵时间

最佳答案

问题中显示的代码片段使用的是termcap接口(interface)(而不是curses)。它使用

tputs(tgoto(cm, x, y), fd, &my_putchar);

其中 my_putchar 可能会写入标准输出,就像程序的其余部分一样(使用 printf )。如果程序被更改为将其所有屏幕输出写入标准错误,那么最后它可以将其结果写入标准输出,从而简化脚本编写。 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 更改输出流而不是initscrdialog当然,使用 newterm

关于c - 在反引号之间执行的程序的 termcap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44723133/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com