ICode9

精准搜索请尝试: 精确搜索
首页 > 系统相关> 文章详细

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

2019-07-17 15:51:40  阅读:356  来源: 互联网

标签:bash linux stdin interactive


有没有办法在调用时将字符串“推”到程序的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 -i; } 3<&0

这是相当聪明的,因为尾随3<& 0在描述符3上复制原始标准输入(文件描述符0),然后运行bash -i,其输入来自两个echo语句.第一个请求日期.第二个重新定向事物,以便标准输入现在来自文件描述符3(即0<& 3部分) - 这是原始标准输入,又称'终端' - 并关闭文件描述符3(这是trailing - ;它是对POSIX shell I/O redirectionBash扩展.

标签:bash,linux,stdin,interactive
来源: https://codeday.me/bug/20190717/1489715.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有