<分区>
有没有办法在调用程序时将字符串“推送”到程序的标准输入流?
这样我们就有了效果
echo "something" | ./my_program
但不是在 “something”
之后读取 EOF,my_program
将从原始标准输入(例如,键盘)读取其进一步输入。
示例:假设我们要启动一个 bash shell,但我们想在其中做的第一件事是调用 date
。 回显日期 | bash
不会完成这项工作,因为 shell 会在运行 date
后终止。
<分区>
有没有办法在调用程序时将字符串“推送”到程序的标准输入流?
这样我们就有了效果
echo "something" | ./my_program
但不是在 “something”
之后读取 EOF,my_program
将从原始标准输入(例如,键盘)读取其进一步输入。
示例:假设我们要启动一个 bash shell,但我们想在其中做的第一件事是调用 date
。 回显日期 | bash
不会完成这项工作,因为 shell 会在运行 date
后终止。
最佳答案
这可能有效:
(echo "something"; cat -) | ./my_program
它创建了一个子 shell,其中第一行输出来自 echo
,其余来自 cat
的标准输入,这是终端(或脚本的标准输入,无论如何)。我使用 -
来强调 cat
是从标准输入读取所必需的——这不仅仅是我忘记在 "$@"
命令之后指定 cat
或其他东西。省略 -
不会造成操作上的差异;这可能会造成可理解性差异。
请注意,my_program
的输入不再是终端,而是连接到终端的管道,这会影响程序的行为。 cat
进程也引入了延迟。
如果这不起作用,那么您可能需要改用 expect
。这是一个通用工具,用于编写与其他程序交互的脚本,它使用伪 ttys (ptys) 使其看起来好像终端上的用户正在与其他程序通信。
作为 anishsane notes , expect
有一个 interact
命令,可用于让用户在一些固定的序言后键入程序。
将其适应您的第二种情况并不是一种舒适的体验:
(echo date; cat -) | bash -i
-i
告诉 Bash 它是一个交互式 shell。 date
起作用了,之后我得到了提示,但我没有再执行任何命令。中断给了我更多提示;几乎其他一切似乎都被忽略了。这可能是 cat
对其输出做了太多缓冲。
我最终从另一个终端窗口杀死了那个 shell。我运气更好:
(echo date; cat -) | bash
但是没有来自 Bash 的提示。当心;确保您知道如何摆脱困境。
rici 和 pointed out 在这种特殊情况下,您可以使用:
{ { echo date; echo 'exec 0<&3-';} | bash -i; } 3<&0
这很聪明,因为尾随的 3<&0
在描述符 3 上复制了原始标准输入(文件描述符 0),然后运行 bash -i
,其输入来自两个 echo
语句。第一个请求日期。第二个重新重定向,使标准输入现在来自文件描述符 3(即 0<&3
部分)——这是原始标准输入,又名“终端”——并关闭文件描述符 3(这是尾随的 -
;它是 Bash POSIX shell I/O redirection 的扩展。
关于linux - 如何将字符串推送到标准输入?在启动时通过 stdin 提供输入,然后以交互方式读取 stdin 输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29292170/