8

bash プロンプトの後、Mac での出力の前に空白行が必要です。次のようになります。

echo; ls

bash プロンプトに改行を追加してから、1 行前に戻ってユーザー入力を待つことはできますか? 私が見逃している明らかなものはありますか?

4

7 に答える 7

11

私はこれが古いことを知っていますが、グーグルでこれに出くわした私のような人にとっては. これがあなたがこれを行う方法です...それは実際には非常に簡単です!

このリンクをチェックしてください -->カーソルの動き

基本的に N 行分上に移動するには:

echo -e "\033[<N>A HELLO WORLD\n"

< N >」を、戻りたい行数に変更するだけです...たとえば、5 行上に移動するには、「/033[5A」になります。

于 2012-10-22T20:30:40.350 に答える
4

私の知る限り、cursesのようなフルスクリーンエミュレーターのようなより低レベルのものを掘り下げない限り、これは不可能です。

于 2008-11-10T16:42:11.323 に答える
3

これは暗闇の中で少し突き刺さりますが、 Vt102ターミナルコードを使用して、Cursesを使用せずにカーソルを制御できる場合があります。関心のある関連するVT102コマンドはすべて、ESC、[、特定のコマンドパラメーターの順に送信することで構成されます。

たとえば、カーソルを1行上に移動するには、次のように出力する必要があります。

ESC  [    1    A
0x1B 0x5B 0x31 0x41

VT102のドキュメントでは通常8進数が使用されているため、16進数を使用している場合はASCIIテーブルを手元に置いてください。

このアドバイスはすべて、テストせずに提供されています。VT102コマンドをbashプロンプトに埋め込むことができるかどうかはわかりませんが、試してみる価値があると思いました。

編集:ええ-多くの人がbashプロンプトでVT102フォーマットコードを使用しているようです。上記の例をBashが認識するものに変換するには、次のようにします。

\e[1A

プロンプトにカーソルを1行上に移動する必要があります。

于 2008-11-10T16:46:28.333 に答える
2

これは非常に可能です。bash がC-vreadline 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はデフォルトでその行も受け入れます。

改行を追加してからカーソルを通常のプロンプトに戻すことは可能ですが(説明したように)、意図した効果は得られません。挿入した改行は、カーソルをその前に戻したので、アプリケーションの出力によって単純に上書きされます。

于 2009-05-13T13:38:06.253 に答える
2

これは機能します:

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

于 2010-08-02T23:53:32.470 に答える
1

'\n\b'プロンプト文字列を入力すると、それが実行されると思います(ただし、試したことはありません) 。

于 2008-11-10T17:06:56.327 に答える
0

一般に、端末でできることを実行するためのコードを知りたい場合は、terminfoman ページを読んでください。

この場合、カーソルが 1 行上にあるコードは次のように決定できます。

tput cuu1

tput 出力をファイルにリダイレクトすると、どの制御文字が使用されているかがわかります。

Bash は PROMPT_COMMAND 変数もサポートしているため、各プロンプトが発行される前に任意のコマンドを実行できます。

于 2009-06-10T18:05:09.443 に答える