2017-06-24 54 views
0

當我通過輸入鍵的readline rebind輸入此腳本時,我將通過自定義函數輸入的每一行都傳遞給應用程序,該自定義函數應呈現正常的bash行爲 - 除非當檢測到當前行是「特殊」:bash readline:代理輸入密鑰

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唯一的辦法或將有可能在此點回落的ReadLine的正常行爲進入時按下(即以某種方式調用其功能accept-line,根據bind -P,通常與\C-M綁定)?

隨着EVAL基礎的解決方案我必須採取的顯示結果之前手動處理多表達式,交互式命令,歷史,顯示提示和命令也重定向護理...

回答

0

可能真的無法找到一個方法來調用readline的接受線程從腳本編程。 所以我試圖手動模仿行爲。要比eval好得多推入歷史,然後使用fc -s來運行最後的命令。

這對我的作品......好吧十歲上下,也許用的人,所以我把它放在:

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

基本上我推表達式,通過history -s$READLINE_LINE提供到歷史當他們被認爲是完整的。然後通過fc -s運行歷史上的最後一條語句。

Here是代碼。