【问题标题】:Execute another script inside heredoc Doc That expect user input in shell在heredoc Doc中执行另一个脚本,期望用户在shell中输入
【发布时间】:2025-12-05 09:35:02
【问题描述】:

我有一个脚本,根据用户输入,我需要调用另一个由 pbrun 以管理员身份运行的脚本,因此我使用PS3select 制作了一个菜单,并根据输入调用了一个函数,其中我正在运行一个 pbrun 并传递一个 here doc 作为这样的输入。

function callS {
pbrun -l /bin/su - admin <<'INNER_EOF'
/home/ankur/testWithout.ksh
INNER_EOF
}

现在一切运行良好,但如果我调用一个脚本,该脚本也使用 PS3select 提供菜单并需要用户从命令行输入才能继续,我无法为调用脚本提供任何输入作为提供的输入是由我的脚本而不是我以管理员身份调用的脚本

知道如何实现这一点吗?

PS:我不能使用expect 因为也不能安装它。无权在系统上安装。

ADMIN 脚本是使用KSH shell 编写的

【问题讨论】:

  • 我的意思是管理脚本是用 KSH 编写的.. 将编辑
  • @andlrc 稍微解释一下为什么会更有用?

标签: bash shell sh ksh


【解决方案1】:

在我看来你想管道输出:

/home/ankur/testWithout.ksh | pbrun -l /bin/su - admin

或者使用process substitution:

pbrun -l /bin/su - admin < <(/home/ankur/testWithout.ksh)

command &lt;(...) 是一个进程替换,它在/proc/self/fd/ 中创建一个临时“文件”供... 写入,该临时文件的名称 是作为 command 的参数返回:

% echo <(ls)
/proc/self/fd/11

Here docs 用于文本,&lt;&lt; 'xyz' 输入被解释为单引号字符串,因此 命令替换 不起作用,也不会 参数扩展。

command &lt; file 将重定向 file 作为 command 的输入。

【讨论】:

  • 不,我不想通过管道输出。被调用的第二个脚本也应该在交互式提示中运行。但是当通过 pbrun 运行时,它并没有在交互式 shell 中运行
最近更新 更多