将文本放入 bash 命令行缓冲区中

将文本放入 bash 命令行缓冲区中

我想以编程方式将一段文本放入 bash 的命令行缓冲区中,读取以进行编辑并用作命令。

我期待的是类似于read -i命令的东西。

-i text如果使用 readline 读取该行,则在编辑开始之前将文本放入编辑缓冲区中。

编辑: 和以编程方式我的意思是想要把这个写在脚本中,启动脚本并准备好命令缓冲区或修改命令历史记录(正如一些问题所建议的那样)。

答案1

我发现了一种奇怪的方法来做到这一点fzf 示例页面。这适用于 bash 4.3 和 perl 5.18:

writecmd () { 
  perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ; 
}

# Example usage
echo 'my test cmd' | writecmd

它将命令打印到标准输出,但也将其复制到命令缓冲区。如果您想直接执行该命令,链接页面上还有一个示例。

答案2

如果这是您要在 readline 绑定中使用的函数bind -x然后你可以修改READLINE_LINE。 (例子

在 readline 绑定之外,您可以使用以下命令将假命令推送到历史记录中history -s

答案3

吉尔斯的答案是正确的,但并不完全令人满意。当我读到这个问题时,OP想要“预置”下一个输入行。就我而言,我想在 PROMPT_COMMAND 函数中读取终端的当前位置。这是可行的,但使用与主 shell 相同的读取缓冲区,因此我在函数中执行了“读取”内置调用,因此任何用户输入都会被丢弃。所以我想单独读取用户输入,让我的终端读取,然后将读取的输入放回到输入缓冲区中,这是最初的问题。请注意,这确实是在同一个进程内,所以理论上应该是可能的。

据我所知(在我的 bash 4.2 上)没有函数可以以编程方式将某些内容推送到输入堆栈。在 zsh 中使用“print -z”。

所以答案是:这在 bash 中是不可能的,你需要使用 zsh 来实现这一点。

答案4

作为替代history -s 'foo'尝试:

echo 'foo' >> ~/.bash_history
history -n

# or
history -s 'foo'
history -a
history -n

相关内容