標準入力をパイプ経由で送信する方法

標準入力をパイプ経由で送信する方法

プログラムの起動直後に標準入力またはキーコードを送信する必要があります。

例えば

$ program | F3

答え1

定義する必要がある始まるそこには。

F3端末デバイスの入力バッファにキーを押すと、端末から送信された文字列を挿入することができます。前にLinux などの一部のシステムで TIOCSTI ioctl() を使用してプログラムを実行する:

{
   perl -le 'require "sys/ioctl.ph";
   ioctl(STDIN, &TIOCSTI, $_) for split "","@ARGV"' "$(tput kf3)"
   program
}

または、expect偽のターミナルレイヤーでプログラムを実行し、プロンプト(または実行中であることを示すもの)が出力されるのを待つなど、開始期待するポイントまで実行し、その出力を送信します。

expect -c 'spawn -noecho program; expect {>} {send [exec tput kf3]}; interact'

(ここではプロンプトを期待していますが、入力を読み取る準備ができたときに出力される>文字列に置き換えてください)。program

stdin をパイプに置き換えることもできますが、そのアプリケーションがF3キーの押下などを想定している場合は、対話型アプリケーションである可能性が高いため、stdin がターミナルでないとうまく機能しない可能性があります。とにかく、試してみることができます。

tput kf3 | program

しかし、programが の出力を読み取った後tput、ファイルの終わり (読み取るものがもうない) が検出され、終了する可能性があります。次のように記述します。

{ tput kf3; cat; } | program

の出力を送信しkf3、その後、を使用してcat、ターミナルに入力したすべての内容を に転送します。ただし、入力が入力と同時に送信されるモードにターミナルが設定され、 の入力がターミナルではないため が実行できなくなるため、これがprogram機能する可能性は低いです。programecho

あなた自身でも同じ設定を行うことができます:

saved_settings=$(stty -g)
stty -icanon -echo min 1 time 0
{ tput kf3; cat; } | program
stty "$saved_settings"

関連情報