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


9

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

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

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

编辑:以编程方式,我的意思是要在脚本中编写此代码,启动脚本,并准备命令缓冲区或修改命令历史记录(如某些问题所建议)。


IIRC screen可以为您做到这一点。
13年

Answers:


6

在fzf示例页面上找到了一种骇人听闻的方法。这适用于bash 4.3和perl 5.18:

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

# Example usage
echo 'my test cmd' | writecmd

它将命令输出到stdout,但也将其复制到命令缓冲区。如果要直接执行命令,则链接页面上还会有一个示例。


这个答案最接近OP的要求。
reza.safiyat

这个答案中的语法略有不同,&TIOCSTI也比它好一点0x5412。值得一提的是,听起来有些平台(例如OpenBSD)禁用了TIOCSTI。我认为这意味着这种方法和zsh print -z都行不通。
dimo414

4

如果这是要在readline绑定中使用的函数,bind -x则可以进行修改READLINE_LINE。(示例

在readline绑定之外,您可以使用将伪造的命令推入历史记录history -s


问题是,如果我history -s 'foo'在脚本中执行操作,则启动后的shell的历史记录根本不会被修改
gioele 2013年

@gioele您必须从外壳中启动它(例如,从加载的脚本中启动source)。您无法通过单独的流程执行任何操作。
吉尔(Gilles)“所以,别再邪恶了”

2

吉尔斯的答案是正确的,但并不完全令人满意。当我阅读此问题时,OP希望“提出”下一条输入行。就我而言,我想在PROMPT_COMMAND函数中读取终端的当前位置。可以,但是使用与主外壳程序相同的读取缓冲区,因此,由于我在函数中执行了“读取”内置调用,因此任何用户输入都将被丢弃。因此,我想分别读取用户输入,进行终端读取,然后将读取的输入放回输入缓冲区,这是原始问题。请注意,这确实是在同一过程中,因此从理论上讲应该是可能的。

据我所见(在bash 4.2上),没有函数以编程方式将某些内容推入输入堆栈。在zsh中,使用'print -z'。

因此答案是:在bash中这是不可能的,您需要为此使用zsh。


0

作为另一种history -s 'foo'尝试:

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

# or
history -s 'foo'
history -a
history -n
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.