GNU/Linux >> Linux の 問題 >  >> Linux

Bashは独自の入力ストリームに書き込むことができますか?

インタラクティブなbashで可能ですか? ユーザーがそのプロンプトでそのテキストを入力したかのように、次のコマンドプロンプトに表示されるように、テキストを出力するコマンドを入力するシェル?

sourceできるようにしたい コマンドラインを生成して出力するスクリプト。スクリプトの終了後にプロンプ​​トが戻ったときに表示されるため、ユーザーはオプションでenterを押す前にコマンドラインを編集できます。 実行します。

これはxdotoolで実現できます ただし、これは、端末がXウィンドウにあり、インストールされている場合にのみ機能します。

[[email protected]] 100 $ xdotool type "ls -l"
[[email protected]] 101 $ ls -l  <--- cursor appears here!

これはbashのみを使用して実行できますか?

承認された回答:

zshを使用 、print -zを使用できます 次のプロンプトのためにラインエディタバッファにテキストを配置するには:

print -z echo test

echo testでラインエディタをプライミングします 次のプロンプトで編集できます。

bashはないと思います にも同様の機能がありますが、多くのシステムでは、TIOCSTIを使用して端末デバイスの入力バッファーをプライミングできます。 ioctl()

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

echo testを挿入します 端末から受信したかのように、端末デバイスの入力バッファに入力します。

@mikeのTerminologyのより移植性の高いバリエーション アプローチであり、セキュリティを犠牲にすることはありませんが、ターミナルエミュレータにかなり標準的なquery status reportを送信することです。 エスケープシーケンス:<ESC>[5n どの端末が常に(入力として)<ESC>[0nとして応答するか 挿入する文字列にバインドします:

bind '"e[0n": "echo test"'; printf 'e[5n'

GNUscreen内の場合 、次のこともできます:

screen -X stuff 'echo test'

ここで、TIOCSTI ioctlアプローチを除いて、入力したかのように文字列を送信するようにターミナルエミュレータに要求しています。その文字列がreadlineの前にある場合 (bash のラインエディタ)がターミナルローカルエコーを無効にしている場合、その文字列は表示されません。 シェルプロンプトで、表示を少し混乱させます。

これを回避するには、端末へのリクエストの送信を少し遅らせて、リードラインによってエコーが無効にされたときにレスポンスが確実に届くようにすることができます。

bind '"e[0n": "echo test"'; ((sleep 0.05;  printf 'e[5n') &)

(ここでは、sleepを想定しています 1秒未満の解像度をサポートします。

関連:sedのスラッシュとバックスラッシュ?

理想的には、次のようなことをしたいと思うでしょう:

bind '"e[0n": "echo test"'
stty -echo
printf 'e[5n'
wait-until-the-response-arrives
stty echo

ただし、bashzshとは異なります )このようなwait-until-the-response-arrivesはサポートされていません 応答を読みません。

ただし、has-the-response-arrived-yetがあります read -t0の機能 :

bind '"e[0n": "echo test"'
saved_settings=$(stty -g)
stty -echo -icanon min 1 time 0
printf 'e[5n'
until read -t0; do
  sleep 0.02
done
stty "$saved_settings"

さらに読む

@mikeservと私が提供した2つのソリューションをさらに詳細に説明した、@starfryの回答をご覧ください。


Linux
  1. Bashでループを作成する方法

  2. どちらの端末が優れているか:BashとZsh

  3. Bashスクリプトをファイルに接続できますか?

  1. LAN でどのコンピュータがオンになっているかを通知する Linux bash スクリプトを作成するにはどうすればよいですか?

  2. Linuxスクリプトで端末のユーザー入力を隠す

  3. Bash/sh 'if else' ステートメント

  1. Bash シェル スクリプト - フラグをチェックしてその値を取得する

  2. Bash変数の文字数をカウントするにはどうすればよいですか

  3. プログラムは独自の elf セクションを読み取ることができますか?