遅いコマンドが終了するのを待つのではなく、バックグラウンドで実行したいと思います。ただし、実行が終了してstdoutに出力されると、次のようになります(█
はカーソルを表します)。
$ slowcmd &
$ cmd_output
█
slowcmd
は任意の遅いコマンドにすることができます(私が試したものについては、alias slowcmd='sleep 1 && echo cmd_output'
と言いました)私はこのようなものが欲しいのに対し:
$ slowcmd && redrawPromptString &
$ cmd_output
$ █
コマンドの出力後、新しいプロンプト文字列が出力されます。
redrawPromptString
にやりたいことをさせるために何ができますか? clear
、kill $$
を試して^C
を端末に送信し、最後にprintf "^C"
を送信しました(もちろん機能しませんでした)。私はbashを実行しています。 (GNU bash、バージョン3.2.57)。
bind
ビルトインの_redraw-current-line
_関数を使用します。最初に、すでにバインドされているかどうかを確認します。
_bind -q redraw-current-line
_
デフォルトでバインドされているのを見たことがないので、おそらくバインドする必要があります。キーの組み合わせを選択します。 Ctrl+Y。すでに使用されているかどうかを確認します。
_bind -p | grep -F '"\C-y'
_
空の出力は、組み合わせが未使用であることを意味します。もしそうなら、それに_redraw-current-line
_をバインドしましょう:
_bind "\C-y":redraw-current-line
_
これで、バックグラウンドプロセスがコマンドラインを台無しにするたびに、 Ctrl+Y。次に、部分的に入力したコマンド(存在する場合)とともにプロンプトが再描画されるため、何も起こらなかったかのように続行できます。
バインディングを永続的にするには、上記のコマンドを_~/.bashrc
_に追加できますが、追加しないでください。正しいアプローチは、_~/.inputrc
_(ユーザーの場合)または_/etc/inputrc
_(システム全体)を変更することです。このようにして、readline(3)
ライブラリを使用するすべてのプログラムが従います。いずれかのファイルに追加する行は次のようになります。
_"\C-y":redraw-current-line
_
ただし、_~/.inputrc
_を新たに作成する場合は、最初の行に_$include /etc/inputrc
_と表示されていることを確認してください。これは、これまでreadline
が_/etc/inputrc
_を使用しており、ワークフローがこのファイルの内容に依存している可能性があるためです。今後、ライブラリは代わりに_~/.inputrc
_を使用します。行_$include /etc/inputrc
_は、システム全体のファイルも解析します。
詳細については、_help bind
_および_man 3 readline
_を参照してください。
Ctrl+L
を押すと、部分的に必要な処理が実行されます。カーソル位置を含め、その時点までに入力したすべてのものを含む現在の行が再描画されますが、画面がクリアされるため、以前の出力が失われます(またはスクロールバックバッファーのターミナルウィンドウの場合)。一方、あなたはclear
を試してみたので、おそらくそれは問題ではありません。