bashコマンドラインバッファーにテキストを置く


9

プログラムで特定のテキストをbashのコマンドラインバッファーに入れ、読み取り、編集してコマンドとして使用したいと思います。

私が楽しみにしているのはread -i、コマンドに似ていますが。

-i text readlineを使用して行を読み取る場合、テキストは編集を開始する前に編集バッファーに配置されます。

編集プログラムでこれをスクリプト記述したい場合は、スクリプトを起動し、コマンドバッファーを準備するか、コマンド履歴を変更します(いくつかの質問が示唆しているように)。


IIRC screenがこれを行います。
ストジー

回答:


6

は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に出力しますが、コマンドバッファーにもコピーします。コマンドを直接実行したい場合は、リンク先のページにも例があります。


この答えは、OPによって要求されたものに最も近いものです。
reza.safiyat 2017

わずかに異なる構文この答えは&TIOCSTIよりビット進歩して0x5412、あまりにも。ただし、一部のプラットフォーム(OpenBSDなど)ではTIOCSTIが無効になっているように見えます。これは、このアプローチとzshの両方が機能しないことを意味すると思いますprint -z
dimo414

4

これをreadlineバインディングで使用する関数に対して行う場合はbind -x、を変更できますREADLINE_LINE。(

readlineバインディングの外で、を使用して偽のコマンドを履歴にプッシュできますhistory -s


問題はhistory -s 'foo'、スクリプトで実行した場合、起動されたシェルの履歴がまったく変更されないことです
gioele

@gioeleシェル内から起動する必要があります(たとえば、でロードするスクリプトからsource)。別のプロセスからは何もできません。
Gilles「SO-邪悪なことをやめよ」

2

Gillesの答えは正しいですが、完全に満足できるものではありません。私がこの質問を読んだとき、OPは次の入力行を「提示」したいと考えています。私の場合、PROMPT_COMMAND関数で端末の現在位置を読み取りたいと思っていました。これは機能しますが、プライマリシェルと同じ読み取りバッファーを使用するため、関数で「読み取り」組み込み呼び出しを実行したため、ユーザー入力はすべて破棄されます。そのため、ユーザー入力を個別に読み取り、端末で読み取りを行い、読み取った入力を入力バッファーに戻しました。これは元の質問です。これは確かに同じプロセス内にあるため、理論的には可能であることに注意してください。

(私のbash 4.2で)確認できる限り、プログラムで入力スタックに何かをプッシュする関数はありません。zshでは、「print -z」を使用しています。

だから答えは:これはbashでは不可能です、これにはzshを使う必要があります。


0

history -s 'foo'試す代わりに:

echo 'foo' >> ~/.bash_history
history -n

# or
history -s 'foo'
history -a
history -n
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.