在bash中,我如何将一个function键绑定到一个命令?

例如:我想把F12键绑定到命令echo "foobar"这样每次我点击F12时 ,“foobar”就会被打印到屏幕上。 理想情况下,它可以是任意的shell命令,而不仅仅是内置命令。 这个怎么办?

你可以通过在命令行上按Ctrlv来确定一个键发出的字符序列,然后按下你感兴趣的键。在我的F12系统上,我得到^[[24~ ^[代表Esc 。 不同types的terminal或terminal仿真器可以为同一个密钥发出不同的代码。

在Bash提示符下,你可以input一个像这样的命令来启用macrosmacros,这样你就可以试用了。

 bind '"\e[24~":"foobar"' 

现在,当你按下F12时 ,你会在命令行上看到“foobar”,以便进一步编辑。 如果你想要一个按键立即input一个命令,你可以添加一个换行符:

 bind '"\e[24~":"pwd\n"' 

现在当你按下F12时 ,你将会看到当前的目录,而不必按Enter键 。 如果你已经input了一些东西,你会使用这个自动执行? 它可能会变得混乱。 但是,您可以将该行作为macros的一部分清除:

 bind '"\e[24~":"\Ck \C-upwd\n"' 

该空间确保Ctrlu有一些东西要删除,以保持铃声响。

一旦你的macros按照你想要的方式工作,你可以通过将它添加到~/.inputrc文件中来使它持久化。 不需要bind命令或外部单引号组:

 "\e[24~":"\Ck \C-upwd\n" 

编辑:

你也可以创build一个键绑定来执行某些操作,而不会干扰当前的命令行。

 bind -x '"\eW":"who"' 

然后当您input一个需要用户名的命令时,例如,您需要知道login的用户名,您可以按AltShiftW ,显示who的输出,提示符重新发出你的部分命令完好无损,光标在行中的相同位置。

不幸的是,这对于输出两个以上字符的键(如F12)不起作用。 在某些情况下,这可以解决。

命令(在这种情况下)可以是任何可执行文件 – 程序,脚本或函数。

您可以在.inputrc中定义bash键绑定(GNU Readline库的configuration文件)。 语法是

<keysym或key name>:macros

例如:

 Control-o: "> output" 

将会创build一个当你按下时插入“>输出”的macros

  "\e[11~": "echo foobar" 

将创build一个macros插入“回声foobar”,当你按F1 …我不知道F1​​1的keysym是什么手。

此解决scheme特定于X11环境,与bash无关,但将以下内容添加到.Xmodmaps中

  % loadkeys keycode 88 = F12 string F12 = "foobar" % 

在打开F12时将发送string“foobar”到terminal。