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

时间:2017-06-23 13:52:21

标签: c bash tty backticks termcap

我正在尝试制作一个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>

感谢您的时间

1 个答案:

答案 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