プログラム的にテキストのフラグメントをbashのコマンドラインバッファに入れ、編集のために読み、コマンドとして使用したいと思います。
私が期待したのは、read -i
コマンドに似たものでした。
-i text
readline を使用して行を読み取ると、編集が開始される前にテキストが編集バッファに配置されます。
編集する:そしてプログラム的に私の言葉は欲しいです。これをスクリプトに入れる、スクリプトを起動し、コマンドバッファを準備するか、コマンド履歴を変更します(一部の質問でわかるように)。
答え1
奇妙な方法が見つかりました。fzfの例ページ。これはbash 4.3とPerl 5.18で動作します。
writecmd () {
perl -e 'ioctl STDOUT, 0x5412, $_ for split //, do{ chomp($_ = <>); $_ }' ;
}
# Example usage
echo 'my test cmd' | writecmd
コマンドを標準出力に出力しますが、コマンドバッファにもコピーします。コマンドを直接実行したい場合は、リンクされたページに例もあります。
答え2
これがreadlineバインディングで使用したい関数であればbind -x
その後、変更できますREADLINE_LINE
。 (はい)
readline バインディングの外側では、次のコマンドを使用して、偽のコマンドを履歴にプッシュできます。history -s
。
答え3
Gilesの答えは正確ですが、完全に満足していません。質問を読んだとき、OPは次の入力行を「事前設定」したかった。私の場合は、PROMPT_COMMAND関数で端末の現在位置を読みたいと思います。これは機能しますが、デフォルトのシェルと同じ読み取りバッファを使用するため、関数で「読み取り」組み込み呼び出しを実行してすべてのユーザー入力を削除します。だから、ユーザー入力を別々に読み込み、端末から読み取ってから、読み取った入力を入力バッファに書き戻したいと思います。これは元の質問でした。これは実際には同じプロセス内にあるため、理論的には可能でなければなりません。
私の知る限り(私のbash 4.2では)入力スタックに何かをプログラムでプッシュする機能はありません。 zsh では「print -z」を使用してください。
したがって、答えは次のようになります。これはbashでは不可能です。これを達成するにはzshを使用する必要があります。
答え4
代わりに、以下をhistory -s 'foo'
試してください。
echo 'foo' >> ~/.bash_history
history -n
# or
history -s 'foo'
history -a
history -n