スクリプトの「\033[6n」のように入力(バッファ)に出力を強制します。

スクリプトの「\033[6n」のように入力(バッファ)に出力を強制します。

(Cプログラムまたはスクリプト)出力が入力バッファに到達するようにパイプとリダイレクトを使用してみましたが、printf "\033[6n"肯定的な結果はありませんでした。

これがどのように可能かを知っている人はいますか?

  1. コマンドライン
  2. シェルスクリプトから
  3. Cコード

パイプ出力_cmd_ > /dev/stdinとCコードにはfprintf(stdin, "blah\n");測定可能な影響はありません。

メモ:私は入力を別のコマンドで「パイプ」したくなく、「キーボードバッファ」(実際)に文字を「注入」したいと思います。

編集する:最初のユースケースは、次のshellことを可能にするSandbox CLIアプリケーションです。system注文するオペレーティングシステム(例:Bas)と対話しますが、いいえファイル記述子を処理します。

ベストアンサー1

編集する:短い答え以前は /dev/uinput、そして今はそうですTIOCSTI(投稿の終わりを参照)


これまでの回答とコメントへの回答は次のとおりです。

ioctl_tty(2)TIOCSTI私はそれを持っていませんが、カーネルのソースコードを見ると(経由)自由電子tiocsti)は、コンテキストを使用する「偽の入力文字」を表示しますtty_struct

問題のアプリケーションは常に対話型で実行されるため、パイプとリダイレクトは使用できません。スクリプトに使用できますが、shell他の同様のアプリケーションとは異なり、結果のキャプチャは許可されず、通常の方法で操作を許可およびstdin実行します。stdout

近い将来、これが変わる可能性はなく、それは私のアプリケーションではありません。ただし、コンテキストを使用して&inを使用すると、カーネルによってキーボードバッファに注入された"\033[6n"結果を切り取ることができます。tty_insert_flip_chartty_schedule_flipsrc/drivers/tty/tty_buffer.ctty_port

私の記憶が正しい場合、FDファイル構造が変更される前に、ただ4つのファイル記述子がこれを達成できます。最近はTTYデバイスに書き込むことができますが、TTYデバイス/dev/stdinに接続されており、TTYデバイスに書き込んだすべての内容は最終的に画面に表示されます()。カーネルは、TTYを使用するときにファイル記述子ルーティングをバイパスするようです。これらの関数はそれを呼び出します。/proc/self/fd/0/dev/tty#/dev/stdoutflipポート

ユーザー空間アプリケーションはこれらのカーネル機能にアクセスできません。 X-Windowsではxvkbdおよびxdotoolまたはを使用できますが、xteこのアプリケーションはLinux(VT)コンソールで使用されます。


(ほぼ)正しい答えは次のとおりです。

/dev/uinputユーザー権限がなくても(ほとんどのシステムでは)すべてのパラメータが機能するsudoスクリプトですprintf

またはキーボードイベントまた、すべてのユーザーがアクセスできるため動作しますが、起動するたびにすべてのシステムを変更します(私は一般的ですが、必ずしも/dev/input/event0そうではありません)。

さらなる調査によると、これらの方法のうち特にスクリプトには実用的ではない。私たちは何をすべきかを理解しなければなりません。私たちはレンダリングしたいだけです。テキスト「キー押しシミュレーション」(上記のデバイスの動作)ではなく、入力バッファにあります。


(最も実用的な)実際の答えは次のとおりです。

オフサイトの質問は、2011年のstackexchangeに対する回答を引用します(ここ)。 。TIOCSTIもう一度Perlの例を見ると、アプリケーションを提供しないスクリプトにも役立ちます。

perl -le 'require "sys/ioctl.ph";
      ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV
     ' `_cmds_`

しかし、画面にも反映されます。数時間の追加調査と実験を経た後、スクリプトやコマンドラインで以下が実用的になりました。

stty -echo; perl -le 'require "sys/ioctl.ph"; ioctl(STDIN, &TIOCSTI, $_) for split "", join " ", @ARGV ' `_cmds_` ;stty echo

メモ:TIOCSTI退会したけどオープンBSD 6.2(2017年10月)明らかにLinuxカーネル開発者は反対キャンセルをしっかり拒否します(次からキャンセルできます)。OpenBSDジャーナル)。

おすすめ記事