インタラクティブな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秒未満の解像度をサポートします。
理想的には、次のようなことをしたいと思うでしょう:
bind '"e[0n": "echo test"'
stty -echo
printf 'e[5n'
wait-until-the-response-arrives
stty echo
ただし、bash
(zsh
とは異なります )このような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の回答をご覧ください。