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

标签 linux bash stdin interactive

<分区>

有没有办法在调用程序时将字符串“推送”到程序的标准输入流?

这样我们就有了效果

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 notesexpect 有一个 interact 命令,可用于让用户在一些固定的序言后键入程序。

小心

将其适应您的第二种情况并不是一种舒适的体验:

(echo date; cat -) | bash -i

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

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

(echo date; cat -) | bash

但是没有来自 Bash 的提示。当心;确保您知道如何摆脱困境。

I/O 重定向特技

ricipointed 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/

相关文章:

ruby-on-rails - 如何在 Amazon Linux 上将 selenium 与 chrome 驱动程序一起使用。错误:Selenium::WebDriver::Error::UnknownError:未知错误:找不到 Chrome 二进制文件

c - 如何在不使用 ls -ln 的情况下在 C 中打印文件详细信息

linux - .eh_frame 和 .eh_frame_hdr 部分究竟存储什么?

bash - rsync 与 ssh 不使用存储在 ~/.ssh/config 中的凭据

python - 如何查找文本文件中某个字符串出现的次数?

C++ 使用 istringstream 从 stdin 读取

linux - net_device.uc_promisc 字段的用途是什么?

linux - 使用 bash 脚本删除 ".bash_aliases"

bash - 如何将命令行参数传递给docker-compose run?

Perl,确定 STDIN 来自哪里