バッシュ:最後のコマンドの出力が改行で終わっているかどうかを知る方法は?


10

ほとんどの場合、コマンドの出力は改行文字で終わります。ただし、そうでない場合もあるため、次のシェルプロンプトが出力と同じ行に出力されます。

例:

root @ hostname [〜]
#echo -n hello helloroot @ hostname [〜]#

私はいつもそれが非常に迷惑だと思っていました。
これで、PS1変数の先頭に「\ n」を追加するだけで済みますが、ほとんどの場合、不要な1行が追加で出力されます。

最後のコマンドの出力が改行で終わったかどうかを知ることは可能ですか?


解決策:
(Dennisに感謝)

PS1='$(printf "%$((`tput cols`-1))s\r")\u@\h [\w]\$ '

これはスーパーユーザーに移動する必要があります。
ℝaphink

私はあなたのバージョンが好きです!$()ある場所で使用し、別の場所でバックティックを使用しました。$()両方でお使いいただけます。
追って通知があるまで一時停止。

知っている。しかし、私にとっては、そのように読む方が簡単です
GetFree、2009

tput colsとにかくCOLUMNS変数の値を出力するだけなので、私は使用しません。また、組み込みのシェルではないため、処理が遅くなります。また、挿入した空白を削除して\e[K(と同等tput el)を含めることもできます。そうすることで、デフォルトの場合にコピーして貼り付けたときに末尾の空白が大量に取得されないようにします。最後に、この魔法をすべての間に含める必要があります。そうしない\[\]、bashがカーソルの位置を2番目に推測しようとし、コマンド/履歴を編集するときに混乱します。
dlitz

1
:全体のことを同じように行うことができますPS1='\[\e[7m%\e[m$( printf "%*s" "$((COLUMNS-1))" "" )\r\e[K\]\u@\h [\w]\$ '
dlitz

回答:


6

私はzshBashの機能をエミュレートするために次のことを試しています:

$ unset PROMPT_SP; for ((i = 1; i <= $COLUMNS + 52; i++ )); do PROMPT_SP+=' '; done
$ PS1='\[\e[7m%\e[m\]${PROMPT_SP: -$COLUMNS+1}\015$ '

これは、逆ビデオのパーセント記号を発行し、その後に次の行に折り返すための一連のスペースが続き、次にキャリッジリターンが続き、その後にドル記号とスペースが続きます。「\ 015」の後にプロンプ​​トエスケープを追加して、プロンプトをカスタマイズできます。

これを使用するかどうかは、端末が右マージン行の折り返し(自動マージン)をどのように処理するかに依存します。PROMPT_SPの長さは任意ですが、少なくとも80か、通常の端末の幅に合わせてください。forループがで実行されるまでに$ COLUMNSがまだ設定されていない場合は、その値をハードコーディングする必要がある場合があり~/.bashrcます。shopt -s checkwinsizeまだ設定されていない場合は、必要な場合があります。


なぜ誰かが各回答に反対票を投じたのでしょうか。うーん...説明はありません。とても役に立ちました。
追って通知があるまで一時停止。

ここではパッド文字列を作成するには、ループを使用せずに、別の方法です:printf -v PROMPT_SP '%*s' $((COLUMNS + 52)) ''
追って通知があるまで一時停止しました。

「逆ビデオパーセント記号」とは何ですか?「ビデオ」という言葉は私を混乱させ、Googleで答えを見つけることができませんでした。
davidchambers 2013年

1
@davidchambers:キャラクターの背景は前景色で表示され、キャラクター自体は背景色で表示されます。man 5 terminfoこの用語を使用するドキュメントを表示するには、「リバースビデオ」を参照して検索してください。
追って通知があるまで一時停止。

0

いいえ、それは不可能です。Bash自体は、開始したプログラムの出力を処理または表示しません。

カーソルの現在位置を確認し、カーソルが左端にない場合は改行を発行するように設定するプログラムを作成できる可能があることに気づきましたPROMPT_COMMAND


良いアイデア。唯一の問題は...カーソルの位置を知ることは可能ですか?
GetFree、2009

0

zshあなたの問題を解決しようとします。最後の出力が改行なしで終了すると、次のようになります。

$ echo -n 'abc'
abc%
$ 

%が反転した背景/前景を使用する場所。それbashが何らかの形で移植可能かどうかはわかりません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.