当我获取此脚本时,通过输入键的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的解决方案,我必须手动处理多行表达式,还需要在显示结果之前重定向交互式命令,历史记录,显示提示和命令...
答案 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是代码。