【发布时间】:2017-06-23 13:52:20
【问题描述】:
我正在尝试制作一个 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...那么,有没有办法让我在两种情况下移动光标并保持格式?
感谢您的宝贵时间
【问题讨论】:
-
只有我一个人,还是这个问题完全不清楚? shell中编译后的二进制文件的调用与代码本身有什么关系?
-
因为它以某种方式改变了上下文,从而改变了程序的行为。然后它输出不同,这对我来说是个问题。
-
它不会改变程序的行为。唯一改变的是你的输出方式。当您将其分配给变量然后
echo时,您可以通过shell 对其进行的任何操作对其进行过滤。 -
好吧,其实我在反引号之间显示的用例是模棱两可的,我修好了
-
tputs()将只输出一个转义序列(以转义字符开头的字符序列),您的终端通过移动光标来解释它。当然,当您自己捕获输出时,这不会按预期工作。如果您需要包含结构的纯文本,则必须找到一种无需“光标移动”即可生成它的方法。
标签: c bash tty backticks termcap