スクリーンショット機能を制御するために入力をトラップしたい。
vim myscreenshot.sh
screenshot(){
ffmpeg -video_size 1920x1080 -framerate 25 -f x11grab -i :0.0+0,0 /tmp/out.mp4
}
close(){
echo "screenshot is over"
exit
}
trap 'screenshot' ctrl+a #how to fix it?
trap 'close' ctrl+b #how to fix it?
コマンド trap 'screenshot' SIGINT
はトラップできますctrl+c
。
私の要件:入力ctrl+a
スクリーンショット機能を開始します、ctrl+b
スクリーンショット機能を停止し、実行後に終了しますbash myscreenshot.sh &
バックグラウンドで。
シェルプロンプトでreadlineを使用する代わりに、次のbashソリューションを検討してください。要件に厳密に一致するソリューション。基本的に:
永遠にループ:
Bashを使用して、行区切り文字が必要なときに1文字ずつ読み取ります。
補足:専用端末のあるウィンドウでプログラムを実行している場合、Ctrl/AとCtrl/Bは、「A」と「B」だけの簡単なものに置き換えることができます。
#! /bin/bash
screenshot(){
rm -f /tmp/out.mp4
exec ffmpeg -video_size 1920x1080 -framerate 25 -f x11grab -i :0.0+0,0 /tmp/out.mp4
}
while true ; do
a=""
echo "Type CTRL/A to start"
while [ "$a" != $'\x01' ] ; do
read -N1 a
done
screenshot &
sleep 3
echo
echo "Type CTRL/B to start"
while [ "$a" != $'\x02' ] ; do
read -N1 a
done
echo "Processing ..."
kill $!
bash myscreenshot.sh &
done
Bashトラップはキーボード入力を処理する方法ではありません。 シグナル を扱います。それはのために働きます Ctrl+C 端末(Bashではない)は、SIGINTシグナルtoをそのキーの組み合わせが押されたときにBashを送信するように構成されているため(run stty -a
そのようなバインディングをすべて表示します)。ただし、信号はこのように使用するようには設計されていません。 trap ... SIGINT
は ほとんど常にプログラムの中断と終了に使用する必要があります 。
@MarkSetchellが示唆したように、 bind
は、次のようなキーバインディングを構成するための適切なツールです Ctrl+A (表記: C-a)。マニュアルには、構成可能な既存のバインディング の詳細が記載されています (特に「その他のコマンド」を参照してください)。 EscCtrl+A (M-C-e)which は現在保留中のコマンドのすべての変数を展開します )。そのことに注意してください C-aデフォルトでbeginning-of-line
にバインドされています 、および C-bbackward-char
にバインドされています。 Readlineマニュアル は、このすべての動作を実際に担当するものであるため、詳細に説明しています。 bind
を使用してさまざまなことを実行する方法については、オンラインでたくさんの記事や例もあるので、「trap」ではなく「bind」を検索するだけで十分です。
ここにあなたが試すことができるいくつかの例があります:
bind "\C-a":display-Shell-version
は Ctrl+A カーソルを行の先頭にジャンプするのではなく、現在のBashバージョンを出力するreadline関数display-Shell-version
を呼び出す。bind -x '"\C-b":"echo Hello World"'
(-x
に注意)は Ctrl+B カーソルを1文字戻すのではなく、シェルコマンドecho Hello World
を呼び出す。任意のキーバインドを構成したいようですが、関連するレイヤーが異なるため、少し難しい作業になる可能性があります。キーボードを監視する「適切な」プログラミング言語で書かれた専用のGUI対応プログラムは、あなたが説明しているようなものにより適しています。明らかにそれはBashと格闘するよりも多くの仕事なので、うまくいけば、bind
から十分なものを得ることができます:)
Ctrl + Aはシグナルを発生させません。Bashトラップはキーボード入力を処理する方法ではありません。シグナルを処理します。 BashではなくCtrl + Cで機能しますが、キーの組み合わせが押されたときに端末がBashにSIGINTシグナルを送信するように構成されているため、stty -a。したがって、最も簡単な方法でそれをトラップすることはできません。
また、この例を見ることができます:
bind "\ C-a":display-Shell-versionは、カーソルを行の先頭にジャンプする代わりに、Ctrl + Aで現在のBashバージョンを出力します。 bind -x '"\ C-b": "echo Hello World"'(注-x)は、Ctrl + Bがシェルコマンドecho Hello Worldを呼び出すようにします。
help bindの実行も検討してください