linux stdin视频,linux – 如何将字符串推送到stdin?在启动时通过stdin提供输入,然后以交互方式读取stdin输入...

有没有办法在调用时将字符串“推”到程序的stdin流?

这样我们才能有效果

echo "something" | ./my_program

但是,不是在“某事”之后读取EOF,my_program将从原始标准输入(例如键盘)读取其进一步输入.

示例:假设我们要启动一个bash shell,但我们要在其中做的第一件事就是调用date.回音日期| bash不会完成这项工作,因为shell会在运行日期后终止.

解决方法:

这可能有效:

(echo "something"; cat -) | ./my_program

它创建了一个子shell,其中第一行输出来自echo,其余来自cat的标准输入,即终端(或者脚本的标准输入,无论如何).我使用 – 强调cat需要从标准输入读取 – 这不仅仅是我忘记在cat命令之后指定“$@”或其他东西.省略 – 不会产生差异;它可能会产生可理解性差异.

请注意,my_program的输入不再是终端,而是连接到终端的管道,这会影响程序的行为.猫的过程也引入了延迟.

期望

如果这不起作用,那么您可能需要使用expect.这是用于脚本与其他程序交互的通用工具,它使用伪ttys(ptys)使其看起来好像终端的用户正在与其他程序通信.

在anishsane notes中,expect有一个交互命令,可以用来让用户在一些固定的前导码后输入程序.

谨防

使其适应您的第二个场景并不是一种舒适的体验:

(echo date; cat -) | bash -i

-i告诉Bash它是一个交互式shell.这个日期有效,我得到了一个提示,但是我没有再执行任何命令.中断给了我更多的提示;几乎其他一切似乎都被忽略了.这可能是猫对其输出做了太多的缓冲.

我最终从另一个终端窗口杀了那个shell.我运气好了:

(echo date; cat -) | bash

但没有来自Bash的提示.小心;确保你知道如何摆脱困境.

I / O重定向特技

rici也是pointed out,在这种特殊情况下,您可以使用:

{ { echo date; echo 'exec 0

这是相当聪明的,因为尾随3

标签:bash,linux,stdin,interactive

来源: https://codeday.me/bug/20190717/1489715.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想让bison从文件中读取输入而不是从stdin读取输入,你可以在程序中打开一个文件,然后将文件的描述符传递给flex和bison。具体步骤如下: 1. 在程序中打开文件,获取文件的描述符: ``` FILE *fp = fopen("input.txt", "r"); if (!fp) { printf("Failed to open input file\n"); exit(1); } ``` 2. 将文件的描述符传递给flex,让它从文件中读取输入。在flex的扫描器中,你可以使用yyin变量指定输入流。为了让flex从文件中读取输入,你可以使用fsetpos或fseek函数将文件指针移动到文件的起始位置,然后将文件指针传递给yyin变量: ``` fsetpos(fp, &pos); // 将文件指针移动到起始位置 yyin = fp; // 将文件指针传递给yyin变量 ``` 或者直接使用fseek函数: ``` fseek(fp, 0, SEEK_SET); // 将文件指针移动到起始位置 yyin = fp; // 将文件指针传递给yyin变量 ``` 3. 将文件的描述符传递给bison,让它从文件中读取输入。你可以使用yyrestart函数重新启动bison的解析器并指定输入流。同样地,在bison的语法文件中,你也需要使用%option noyywrap来禁用默认的yywrap函数,防止它在文件末尾自动关闭输入流: ``` %option noyywrap %{ #include <stdio.h> #include <stdlib.h> %} %token INTEGER %% input: /* empty */ | input line ; line : INTEGER '\n' { printf("Read integer: %d\n", $1); } ; %% int main(int argc, char *argv[]) { FILE *fp = fopen("input.txt", "r"); if (!fp) { printf("Failed to open input file\n"); exit(1); } // 将文件的描述符传递给flex fsetpos(fp, &pos); yyin = fp; // 将文件的描述符传递给bison yyrestart(fp); yyparse(); fclose(fp); return 0; } ``` 这样,bison就可以从文件中读取输入了。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值