How could I execute a script in Shell when a shortcut key is pressed.
Essentially what I need is when a shortcut key is pressed the script should read from a file and display that content in the terminal.
Answers:
Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.
Method 1
You can use the builtin command, bind to map a keyboard shortcut so that it executes a command/shell script.
Example
Say we want to run the command, pwd, when we press the F12 key.
$ bind '"e[24~":"pwdn"'
Now when I press F12 at my prompt, $:
$ pwd /home/saml
Determining keyboard shortcuts
You can use the following technique to determine the escape code for a given keyboard shortcut. On most systems press Ctrl + V, release, and then press the key you want the code for. There are some other systems it will work with M instead of V
Example
Pressing Ctrl + V then release both Ctrl and V and finally press F12 in a terminal window returns this:
$ ^[[24~
This output can be interpreted as follows, ^[ is the Esc key. So when we want to specify this particular key using the bind command we need to use a e to denote the Esc key followed by everything else from above. So the bind command looks like this:
$ bind '"e[24~":"....."'
Executing a command in the middle
You can also make use of bind -x to setup keyboard shortcuts that will run commands while you’re in the middle of typing something at the prompt, and these commands’ output will be displayed, but what ever you were typing at the prompt will remain intact.
$ bind -x '"eW":"..."'
NOTE: This method only works with keyboard shortcuts that output 1 character, so F12 won’t work here.
Example
Let’s alias the keyboard shortcut Alt + Shift + W.
$ bind -x '"eW":"who"'
Say I’m typing the command finger:
$ finger
Now I hit the keyboard shortcut Alt + Shift + W:
saml tty1 2013-09-01 11:01 (:0) saml pts/0 2013-09-01 11:03 (:0.0) saml pts/1 2013-09-01 11:05 (:0.0) saml pts/2 2013-09-01 11:05 (:0.0) saml pts/5 2013-09-03 22:45 (:0.0) $ finger
What’s going on is bind is running the command defined, who, taking its output and inserting it in front of the prompt. If you repeat it you’ll see what’s going on, here’s output from me hitting it 2 times:
saml tty1 2013-09-01 11:01 (:0) saml pts/0 2013-09-01 11:03 (:0.0) saml pts/1 2013-09-01 11:05 (:0.0) saml pts/2 2013-09-01 11:05 (:0.0) saml pts/5 2013-09-03 22:45 (:0.0) saml tty1 2013-09-01 11:01 (:0) saml pts/0 2013-09-01 11:03 (:0.0) saml pts/1 2013-09-01 11:05 (:0.0) saml pts/2 2013-09-01 11:05 (:0.0) saml pts/5 2013-09-03 22:45 (:0.0) $ finger
Your problem
So one idea would be to use the bind -x method above and cat to display this text file at your prompt:
$ bind -x '"eW":"cat someinfo.txt"'
Now when I run commands I can see this file like so:
This is text from some multi-line file reminding me how to do some stuff $ finger
The output of file someinfo.txt is being displayed above my finger command above.
References
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0