プログラムで特定のテキストをbashのコマンドラインバッファーに入れ、読み取り、編集してコマンドとして使用したいと思います。
私が楽しみにしているのはread -i
、コマンドに似ていますが。
-i text
readlineを使用して行を読み取る場合、テキストは編集を開始する前に編集バッファーに配置されます。
編集:プログラムでこれをスクリプトで記述したい場合は、スクリプトを起動し、コマンドバッファーを準備するか、コマンド履歴を変更します(いくつかの質問が示唆しているように)。
プログラムで特定のテキストをbashのコマンドラインバッファーに入れ、読み取り、編集してコマンドとして使用したいと思います。
私が楽しみにしているのはread -i
、コマンドに似ていますが。
-i text
readlineを使用して行を読み取る場合、テキストは編集を開始する前に編集バッファーに配置されます。
編集:プログラムでこれをスクリプトで記述したい場合は、スクリプトを起動し、コマンドバッファーを準備するか、コマンド履歴を変更します(いくつかの質問が示唆しているように)。
回答:
私はfzfの例のページでこれを行うハックな方法を見つけました。これはbash 4.3およびperl 5.18で動作します。
writecmd () {
perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ;
}
# Example usage
echo 'my test cmd' | writecmd
コマンドをstdoutに出力しますが、コマンドバッファーにもコピーします。コマンドを直接実行したい場合は、リンク先のページにも例があります。
これをreadlineバインディングで使用する関数に対して行う場合はbind -x
、を変更できますREADLINE_LINE
。(例)
readlineバインディングの外で、を使用して偽のコマンドを履歴にプッシュできますhistory -s
。
history -s 'foo'
、スクリプトで実行した場合、起動されたシェルの履歴がまったく変更されないことです
source
)。別のプロセスからは何もできません。
Gillesの答えは正しいですが、完全に満足できるものではありません。私がこの質問を読んだとき、OPは次の入力行を「提示」したいと考えています。私の場合、PROMPT_COMMAND関数で端末の現在位置を読み取りたいと思っていました。これは機能しますが、プライマリシェルと同じ読み取りバッファーを使用するため、関数で「読み取り」組み込み呼び出しを実行したため、ユーザー入力はすべて破棄されます。そのため、ユーザー入力を個別に読み取り、端末で読み取りを行い、読み取った入力を入力バッファーに戻しました。これは元の質問です。これは確かに同じプロセス内にあるため、理論的には可能であることに注意してください。
(私のbash 4.2で)確認できる限り、プログラムで入力スタックに何かをプッシュする関数はありません。zshでは、「print -z」を使用しています。
だから答えは:これはbashでは不可能です、これにはzshを使う必要があります。
screen
がこれを行います。