In bash, come si associa un tasto funzione a un comando?

Esempio: Voglio associare il tasto F12 al comando echo "foobar" tale che ogni volta che premo F12 il messaggio “foobar” verrà stampato sullo schermo. Idealmente potrebbe essere qualsiasi comando di shell arbitrario, non solo builtins. Come si fa a fare questo?

Puoi determinare la sequenza di caratteri emessa da un tasto premendo Ctrlv sulla riga di comando, quindi premendo il tasto a cui sei interessato. Sul mio sistema per F12 , ottengo ^[[24~ . Il ^[ rappresenta Esc . Diversi tipi di terminali o emulatori di terminali possono emettere codici diversi per la stessa chiave.

Al prompt di Bash puoi inserire un comando come questo per abilitare la macro della chiave in modo che tu possa provarla.

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

Ora, quando premi F12 , avrai “foobar” sulla riga di comando pronto per ulteriori modifiche. Se si desidera che una sequenza di tasti entri immediatamente in un comando, è ansible aggiungere una nuova riga:

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

Ora quando premi F12 , visualizzerai la directory corrente senza dover premere Invio . Cosa succede se hai già digitato qualcosa sulla linea e lo usi che viene eseguito automaticamente? Potrebbe diventare caotico. Tuttavia, è ansible cancellare la linea come parte della macro:

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

Lo spazio si assicura che il Ctrlu abbia qualcosa da eliminare per far squillare la campana.

Una volta che hai ottenuto il funzionamento della macro nel modo desiderato, puoi renderlo persistente aggiungendolo al tuo file ~/.inputrc . Non è necessario il comando bind o il set esterno di virgolette singole:

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

Modificare:

È inoltre ansible creare un legame chiave che eseguirà qualcosa senza disturbare la riga di comando corrente.

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

Quindi, mentre stai digitando un comando che richiede un nome utente, ad esempio, e devi conoscere i nomi degli utenti che hanno effettuato l’accesso, puoi premere AltShiftW e l’output di who verrà visualizzato e il prompt visualizzerà essere ri-emesso con il comando parziale intatto e il cursore nella stessa posizione nella riga.

Sfortunatamente, questo non funziona correttamente per chiavi come F12 che emettono più di due caratteri. In alcuni casi questo può essere risolto.

Il comando ( who in questo caso) potrebbe essere qualsiasi eseguibile: un programma, uno script o una funzione.

È ansible definire associazioni di chiavi bash in .inputrc (file di configurazione per la libreria GNU Readline). La syntax è

: macro

per esempio:

 Control-o: "> output" 

creerà una macro che inserisce “> output” quando si preme

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

creerà una macro che inserisce “echo foobar” quando si preme F1 … Non so cosa sia fuori mano il keysym per F11.

Questa soluzione è specifica per gli ambienti X11 e non ha nulla a che fare con bash, ma aggiungendo quanto segue ai tuoi .Xmodmaps

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

invierà la stringa “foobar” al terminale dopo aver colpito F12.

Volevo colbind Ctrl+B a un comando. Ispirato da una risposta sopra, ho cercato di usare il bind ma non riuscivo a capire quale serie di scarabocchi criptici ( \e[24~ ?) Traducono in Ctrl+B

Su un Mac, vai su Impostazioni dell’app Terminale, Profili -> Tastiera -> + quindi premi la scorciatoia da tastiera che stai cercando ed esce. Per me Ctrl+B ha \002 che sono riuscito a comandare

bind '"\002":"echo command"'

Inoltre, se vuoi che il comando venga eseguito direttamente (non solo inserito nel prompt), puoi aggiungere Invio alla fine del tuo comando, in questo modo:

bind '"\002":"echo command\015"'