bash:バインドされたコマンド(redraw-current-lineなど)をプログラムで呼び出す方法はありますか?

bash:バインドされたコマンド(redraw-current-lineなど)をプログラムで呼び出す方法はありますか?

redraw-current-lineキーストロークのマッピングを使用する方法の多くの説明に触れましたが、bindユーザーがキーストロークを入力せずに他の理由(タイマー、バックグラウンドタスクなど)のプロンプトを再描画したいと思います。簡単だと思いましたが、何も見つけられません。ありがとうございます!

答え1

私は同じ問題に直面しましたが、満足のいくものが見つからなかったので、ここにいくつかの解決策があります。

${PS1@P}

最新のbashバージョンでは、独自の印刷プロンプトを使用できますecho "${PS1@P}"。変数拡張の形式は、${var@P}変数内のプロンプトエスケープ文字を拡張することを意味します。

kill -WINCH "$$"

もう一度試すことができる方法は、kill your shellを使用することですSIGWINCH。これにより、readlineはプロンプトを再描画します。例:

$ (sleep 2; echo foo; sleep 2; kill -WINCH "$$") &
[1] 2295
<immediately press l and s; the "foo" text will mess up the current line>
$ lsfoo
<after 1s the prompt is redrawn again without the parasitic text>
$ ls

ioctl(TIOCSTI)

もう1つのトリックは、通常どおりredraw-current-line未使用のキーをバインドしてから、TIOCSTIioctlを使用してそのキーをシミュレートすることです(追加の権限なしで動作し続けます)。現在のLinuxではtty)。しかし、C、Perl、Pythonなどが必要です。

$ bind '"\xff": redraw-current-line'
$ redraw_current_line(){ perl -e 'ioctl STDIN, 0x5412, $x = "\xff"' </dev/tty; }
$ (sleep 2; echo foo; sleep 2; redraw_current_line) &
.... same as in SIGWINCH example ...

この最後のヒントはLinuxでのみ機能します。TIOCSTIioctl番号は、それをサポートする他のシステムとは異なる場合があります。


メモ:require "sys/ioctl.h"誰かが私がioctl番号を直接リンクする必要があると思うなら:いいえ、できません。。偶然に働いてもこれこの場合、Perlh2phはボーキングされ、.phファイルは次のようになります。いいえ使用:

$ perl -e 'require "sys/ioctl.ph"; printf "%x\n", TIOCGPTN()'
80005430
$ cc -include stdio.h -include sys/ioctl.h -xc - \
   <<<'int main(){printf("%lx\n",TIOCGPTN);}' -o /tmp/foo && /tmp/foo
80045430

実際の追加ビットに注意してください8004543080005430

関連情報