web-dev-qa-db-ja.com

bashがcatコマンドの後にプロンプ​​トを新しい行に置くようにするにはどうすればよいですか?

私が得るもの:

Host:~ user$ cat example.txt
some texthost:~ stas$

私が取得したいもの:

Host:~ user$ cat example.txt
some text
Host:~ stas$

catをこのように動作させる方法はありますか?

Mac OS Xでbashを使用しています。

21

ほとんどのUNIXツールは、テキストファイルで適切に機能するように設計されています。テキストファイルは一連の行で構成されます。行は、改行文字で終わる印刷可能な文字のシーケンスで構成されます。特に、空でないテキストファイルの最後の文字は常に改行文字です。明らかに、example.txtにはsome textのみが含まれ、最後の改行は含まれていないため、テキストファイルではありません。

catは簡単な仕事をします。任意のファイルをテキストファイルに変換することは、その仕事の一部ではありません。他のいくつかのツールは常に入力をテキストファイルに変換します。表示しているファイルが改行で終わっているかどうかわからない場合は、catではなくawk 1を実行してみてください。

前のコマンドがカーソルを最後のマージン以外の場所に置いた場合、bashに次の行にプロンプ​​トを表示させることができます。これを.bashrcに入れます(バリエーション GetFreeによる 提案 Denis Williamsonによる ):

shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1

私は次の方法を好みます...

cat example.txt ; echo

これはexample.txtの内容を評価したり、時々改行を追加したりしません。猫が終わったら改行をエコーするだけで覚えやすく、強い引用と弱い引用のどちらを正しく使用しているかについて誰も考えていません。

唯一の欠点は、実際には、ファイルに独自の末尾改行がある場合、余分な改行が取得されることです。

13
Amos

私は@Gillesの回答を使い始めましたが、ターミナルが列数を変更すると、期待どおりにプロンプ​​トが行の先頭になくなることがわかりました。これは、tmux /画面分割、GUIコンテナの手動サイズ変更、フォントの変更など、さまざまな理由で発生する可能性があります。

私が本当に欲しかったのは、端末が最初の列以外の場所でプロンプトを印刷し始めた場合に改行が追加されるものでした。これを行うには、現在の列を取得する方法を理解する必要がありました。これを取得するには this answer を使用しました。最終的に機能するプロンプト構成は次のとおりです。

###
# Configure PS1 by using the old value but ensuring it starts on a new line.
###
__configure_Prompt() {
  PS1=""

  if [ "$(__get_terminal_column)" != 0 ]; then
    PS1="\n"
  fi

  PS1+="$PS1_WITHOUT_PREPENDED_NEWLINE"
}

###
# Get the current terminal column value.
#
# From https://stackoverflow.com/a/2575525/549363.
###
__get_terminal_column() {
  exec < /dev/tty
  local oldstty=$(stty -g)
  stty raw -echo min 0
  echo -en "\033[6n" > /dev/tty
  local pos
  IFS=';' read -r -d R -a pos
  stty $oldstty
  echo "$((${pos[1]} - 1))"
}

# Save the current PS1 for later.
PS1_WITHOUT_PREPENDED_NEWLINE="$PS1"

# Use our Prompt configuration function, preserving whatever existing
# Prompt_COMMAND might be configured.
Prompt_COMMAND="__configure_Prompt;$Prompt_COMMAND"
7
Brian Donovan

これに関する問題は、example.txtのファイルの最後に改行がないことです。

4
Bonsi Scott

catの使用を主張する場合、これは両方のタイプのファイルで機能し、末尾に改行がある場合とない場合があります。

echo "`cat example.txt`"

.bashrcで、選択した名前(catも含む)を持つ関数に変換できます。

cat1(){ echo "`/bin/cat $@`";}
2
woodengod

.bashrcにも追加できます

Prompt_COMMAND="printf '\n';$Prompt_COMMAND"

私のために働く。

0
klaus