web-dev-qa-db-ja.com

bashを取得して新しいプロンプト文字列を出力し、現在の行を再描画するコマンドはありますか?

遅いコマンドが終了するのを待つのではなく、バックグラウンドで実行したいと思います。ただし、実行が終了してstdoutに出力されると、次のようになります(はカーソルを表します)。

$ slowcmd &
$ cmd_output
█
  • カーソルの前にプロンプ​​ト文字列がありません。
  • slowcmdは任意の遅いコマンドにすることができます(私が試したものについては、alias slowcmd='sleep 1 && echo cmd_output'と言いました)

私はこのようなものが欲しいのに対し:

$ slowcmd && redrawPromptString &
$ cmd_output
$ █

コマンドの出力後、新しいプロンプト文字列が出力されます。

redrawPromptStringにやりたいことをさせるために何ができますか? clearkill $$を試して^Cを端末に送信し、最後にprintf "^C"を送信しました(もちろん機能しませんでした)。私はbashを実行しています。 (GNU bash、バージョン3.2.57)。

1
Ari Sweedler

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_を参照してください。

1

Ctrl+Lを押すと、部分的に必要な処理が実行されます。カーソル位置を含め、その時点までに入力したすべてのものを含む現在の行が再描画されますが、画面がクリアされるため、以前の出力が失われます(またはスクロールバックバッファーのターミナルウィンドウの場合)。一方、あなたはclearを試してみたので、おそらくそれは問題ではありません。

1
RalfFriedl