web-dev-qa-db-ja.com

スクリーンショット機能を制御するために入力をトラップする方法は?

スクリーンショット機能を制御するために入力をトラップしたい。

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 &バックグラウンドで。

2
showkey

シェルプロンプトでreadlineを使用する代わりに、次のbashソリューションを検討してください。要件に厳密に一致するソリューション。基本的に:

永遠にループ:

  • Ctrl/Aを待つ
  • 背景でスクリーンショットを開始
  • Ctrl/Bを待つ
  • スクリーンショットを停止し、外部のscreenshot.shを実行します

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
2
dash-o

Bashトラップはキーボード入力を処理する方法ではありません。 シグナル を扱います。それはのために働きます Ctrl+C 端末(Bashではない)は、SIGINTシグナルtoをそのキーの組み合わせが押されたときにBashを送信するように構成されているため(run stty -a そのようなバインディングをすべて表示します)。ただし、信号はこのように使用するようには設計されていません。 trap ... SIGINTほとんど常にプログラムの中断と終了に使用する必要があります

@MarkSetchellが示唆したように、 bind は、次のようなキーバインディングを構成するための適切なツールです Ctrl+A (表記: C-a)。マニュアルには、構成可能な既存のバインディング の詳細が記載されています (特に「その他のコマンド」を参照してください)。 EscCtrl+AM-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から十分なものを得ることができます:)

5
dimo414

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の実行も検討してください

1
TripleM