bash readline:proxy enter key

时间:2017-06-24 14:15:07

标签: bash readline

当我获取此脚本时,通过输入键的readline重新绑定,我传递通过自定义函数输入的每一行,这应该呈现正常的bash行为 - 除非检测到当前行是“特殊”:< / p>

my_eval () {
    local cur_line="$READLINE_LINE"
    (...) <some special checks and actions if line matches criteria >
    # when crits DON'T match I want normal behaviour:
    eval "$cur_line"  # <- the only way?
    READLINE_LINE=""        
}
bind -x '"\C-M": "my_eval"'

我的问题是如何在这样的输入处理程序中获得正常行为:调用eval是唯一的方法,或者当按下enter时可以回退到readline的正常行为(即调用它{{1}函数以某种方式,通常绑定到accept-line,根据\C-M)?

使用基于eval的解决方案,我必须手动处理多行表达式,还需要在显示结果之前重定向交互式命令,历史记录,显示提示和命令...

1 个答案:

答案 0 :(得分:0)

实际上找不到从脚本以编程方式调用readline的接受行的方法。 所以我试图手动模仿行为。比eval好得多似乎是要进入历史,然后使用fc -s运行最后一个命令。

这对我有用......好吧,也许对某人有用,所以我把它戴上了:

https://github.com/axiros/readline_proxy/

基本上,我认为$READLINE_LINE中提供的表达式会在history -s被视为完成后通过fc -s推送到历史记录中。然后通过 using (var client = new ExampleService_TestClient()) { client.ClientCredentials.UserName.UserName = "user"; client.ClientCredentials.UserName.Password = "pass"; var request = new ExampleService_TestRequest(requestData); var response = client.ExampleService_Test(request); // response.Response_MT is null // when it should have errorMsg="OK" } 运行历史记录中的最后一个语句。

Here是代码。