bash プロンプトの後、Mac での出力の前に空白行が必要です。次のようになります。
echo; ls
bash プロンプトに改行を追加してから、1 行前に戻ってユーザー入力を待つことはできますか? 私が見逃している明らかなものはありますか?
私はこれが古いことを知っていますが、グーグルでこれに出くわした私のような人にとっては. これがあなたがこれを行う方法です...それは実際には非常に簡単です!
このリンクをチェックしてください -->カーソルの動き
基本的に N 行分上に移動するには:
echo -e "\033[<N>A HELLO WORLD\n"
「< N >」を、戻りたい行数に変更するだけです...たとえば、5 行上に移動するには、「/033[5A」になります。
私の知る限り、cursesのようなフルスクリーンエミュレーターのようなより低レベルのものを掘り下げない限り、これは不可能です。
これは暗闇の中で少し突き刺さりますが、 Vt102ターミナルコードを使用して、Cursesを使用せずにカーソルを制御できる場合があります。関心のある関連するVT102コマンドはすべて、ESC、[、特定のコマンドパラメーターの順に送信することで構成されます。
たとえば、カーソルを1行上に移動するには、次のように出力する必要があります。
ESC [ 1 A
0x1B 0x5B 0x31 0x41
VT102のドキュメントでは通常8進数が使用されているため、16進数を使用している場合はASCIIテーブルを手元に置いてください。
このアドバイスはすべて、テストせずに提供されています。VT102コマンドをbashプロンプトに埋め込むことができるかどうかはわかりませんが、試してみる価値があると思いました。
編集:ええ-多くの人がbashプロンプトでVT102フォーマットコードを使用しているようです。上記の例をBashが認識するものに変換するには、次のようにします。
\e[1A
プロンプトにカーソルを1行上に移動する必要があります。
これは非常に可能です。bash がC-v
readline quoted-insert コマンドとして設定されている場合は、以下を .xml に追加するだけです~/.inputrc
。
RETURN: "\C-e\C-v\n\C-v\n\n"
これにより、bash(実際にはreadline)は、通常の解釈された改行の前に2つの逐語的な改行を挿入します。デフォルトでは、1 つだけが挿入されます。これにより、プロンプトの後の行から出力が開始されます。
C-v
がquoted-insert に設定されているかどうかをテストするには、bash (つまりCtrl+V
) に続けて上矢印などを入力します。これは印刷さ^[[A
れるか、同様のものになります。そうでない場合は、バインドすること~/.inputrc
もできます。
C-v: quoted-insert
RETURN: "\C-e\C-v\n\C-v\n\n"
~/.inputrc
存在しない場合は作成できます。readline re-read-init-file コマンド (デフォルトでは on C-x C-r
) を発行しない限り、bash を実行しても変更は有効になりません。ただし、注意してください。何か間違ったことをすると、Enter はコマンドを発行しなくなり、間違いを修正するのが難しくなる可能性があります。何か間違ったことをした場合、C-o
はデフォルトでその行も受け入れます。
改行を追加してからカーソルを通常のプロンプトに戻すことは可能ですが(説明したように)、意図した効果は得られません。挿入した改行は、カーソルをその前に戻したので、アプリケーションの出力によって単純に上書きされます。
これは機能します:
trap echo DEBUG
空のプロンプトでリターンを押しても、余分な改行は追加されません。
上記のコマンドにより、次のようなパイプラインまたはマルチコマンド ラインのすべてのメンバーに対して改行が出力されます。
$ echo foo; echo bar
\n
foo
\n
bar
これを防ぐには、すべてのコマンド出力の前に余分な改行が 1 つだけ出力されるようにします。
PROMPT_COMMAND='_nl=true'; trap -- '$_nl && [[ $BASH_COMMAND != $PROMPT_COMMAND ]] && echo; _nl=false' DEBUG
トラップは各コマンドのDEBUG
前に実行されるため、最初のコマンドの前にフラグが true かどうかを確認し、true の場合は改行を出力します。次に、フラグを false に設定して、その行のその後の各コマンドが余分な改行をトリガーしないようにします。
の内容は$PROMPT_COMMAND
プロンプトが出力される前に実行されるため、フラグは true に設定され、次のサイクルの準備が整います。
空のコマンド ラインで Enter キーを押すと、トラップ内のテストの内容の実行が引き続きトリガーされるため、それらの内容が現在のコマンドとしてチェックされ、一致する場合$PROMPT_COMMAND
は実行されません。echo
'\n\b'
プロンプト文字列を入力すると、それが実行されると思います(ただし、試したことはありません) 。
一般に、端末でできることを実行するためのコードを知りたい場合は、terminfo
man ページを読んでください。
この場合、カーソルが 1 行上にあるコードは次のように決定できます。
tput cuu1
tput 出力をファイルにリダイレクトすると、どの制御文字が使用されているかがわかります。
Bash は PROMPT_COMMAND 変数もサポートしているため、各プロンプトが発行される前に任意のコマンドを実行できます。