実行前に編集されるプリフィルコマンドなど、コマンドラインに文字列を挿入するコマンド

実行前に編集されるプリフィルコマンドなど、コマンドラインに文字列を挿入するコマンド

次の例では、$bashプロンプトでEnterキーを押すことを象徴するようにコマンド/エイリアスをどのように設定しますかfoo

$ foo bar⏎

Enterキーを押す前に「bar」を変更できるように、「bar」(またはコマンドに渡す別の文字列)がコマンドラインに入力/入力/事前入力または入力されますか?例えば

$ bar
$ barbaz⏎ 

試しましたが、成功しなかったし、したくecho bar > /dev/pts/123ありませんxdotool。可能ですか?


編集:ユースケースの例、「greppyオートコンプリート」:

覚えにくいパラメータを多く含む長いコマンドが必要なことがよくあります。例をファイルに保存します。

コマンド.txt:

ffmpeg -i infile.mp4 -c:v copy -c:a copy -y transcoded.mp4
sox in.wav out.wav remix 1 0

さて、上記のコマンドがあればこれと呼びますinject。エイリアスを持つことができます。

grepcomplete () {
  inject $(grep $0 commands.txt)
}

だから私が覚えているとき、私は必要ですミックスなにか思い出せません。ソックス対応するパラメータを入力し、入力したgrepcomplete remixようsox in.wav out.wav remix 1 0にコマンドラインに座って編集して調整する準備が整ったら、Enterキーを押して実行できます。何も選択、コピー、貼り付ける必要はありません。

Kamilがコメントで提案したように、bashの履歴検索(Ctrl-R)を使用し、history -r commands.txtbashrcで同様の操作を実行して独自の「記録」を提供できます。
それでも私のアプローチの良いことは、たとえば、構文の強調表示を使用してすべての一致を表示して簡単にハッキングできることです。

私はこの質問に直接答え、このコマンドの実装を提供したことに注意してくださいinject

ベストアンサー1

以下は、以下からインスピレーションを得た小さくて醜いソリューションです。Perlソリューションを介して各プロンプトの後に文字列を挿入する、TIOCSTIの使用Pythonに適応する:

次のbash機能.bashrc

inject () {
(python -c "import fcntl; import termios; import sys
with open('/dev/stdout', 'w') as fd:
  for c in ' '.join(sys.argv[1:]): fcntl.ioctl(fd, termios.TIOCSTI, c)" "$@" &)
}

使用法:

inject foo bar

メモ:

  • 今はUnicodeを処理できません!for char in str犯人が疑われますか?
  • サブシェルの背景構造( foo &) プロンプトの前に文字列の二重エコーを防ぐ
  • 引数間のスペースを食べます:inject foo bar= inject foo bar。使用inject "foo bar"
  • タイミングによって異なりますので、競争条件があると思いますか?
  • bashサブシェルなしで実行でき、パイプ、xargsなどに適しているPythonスレッド/マルチプロセッシング機能を持つ他のバージョンがあります。これは私のユースケースにとって最もクリーンでシンプルなソリューションです。

おすすめ記事