我想以编程方式在bash的命令行缓冲区中放入一段文本,阅读以进行编辑并用作命令。
我期待的是与read -i
命令类似的东西。
-i text
如果使用readline读取行,则在开始编辑之前将文本放入编辑缓冲区。
编辑:以编程方式,我的意思是要在脚本中编写此代码,启动脚本,并准备命令缓冲区或修改命令历史记录(如某些问题所建议)。
我想以编程方式在bash的命令行缓冲区中放入一段文本,阅读以进行编辑并用作命令。
我期待的是与read -i
命令类似的东西。
-i text
如果使用readline读取行,则在开始编辑之前将文本放入编辑缓冲区。
编辑:以编程方式,我的意思是要在脚本中编写此代码,启动脚本,并准备命令缓冲区或修改命令历史记录(如某些问题所建议)。
Answers:
我在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,但也将其复制到命令缓冲区。如果要直接执行命令,则链接页面上还会有一个示例。
如果这是要在readline绑定中使用的函数,bind -x
则可以进行修改READLINE_LINE
。(示例)
在readline绑定之外,您可以使用将伪造的命令推入历史记录history -s
。
history -s 'foo'
在脚本中执行操作,则启动后的shell的历史记录根本不会被修改
source
)。您无法通过单独的流程执行任何操作。
吉尔斯的答案是正确的,但并不完全令人满意。当我阅读此问题时,OP希望“提出”下一条输入行。就我而言,我想在PROMPT_COMMAND函数中读取终端的当前位置。可以,但是使用与主外壳程序相同的读取缓冲区,因此,由于我在函数中执行了“读取”内置调用,因此任何用户输入都将被丢弃。因此,我想分别读取用户输入,进行终端读取,然后将读取的输入放回输入缓冲区,这是原始问题。请注意,这确实是在同一过程中,因此从理论上讲应该是可能的。
据我所见(在bash 4.2上),没有函数以编程方式将某些内容推入输入堆栈。在zsh中,使用'print -z'。
因此答案是:在bash中这是不可能的,您需要为此使用zsh。
screen
可以为您做到这一点。