catコマンドの後にbashにプロンプ​​トをラップさせるにはどうすればよいですか?

catコマンドの後にbashにプロンプ​​トをラップさせるにはどうすればよいですか?

私が得るもの:

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

私が欲しいもの:

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

cat私がこのように振る舞う方法はありませんか?

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

答え1

私は次のアプローチを好む...

cat example.txt ; echo

example.txtこれは内容を評価したり、時々改行文字を追加したりしません。 catが完了すると、覚えやすい改行文字のみを反映し、強い参照や弱い参照を正しく使用したかどうかは考えません。

実際に唯一の欠点は、ファイルに独自の末尾の改行文字がある場合、追加の改行文字を取得することです。

答え2

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

cat単純な作業を行うことは、任意のファイルをテキストファイルに変換する作業の一部ではありません。一部の他のツールは常に入力をテキストファイルに変換します。表示されるファイルが改行で終わるかどうかわからないawk 1場合cat

前のコマンドが最後の余白を超えてカーソルを離れた場合、 bash に次の行にプロンプ​​トを表示させることができます。これをあなたの.bashrc(変形無料で入手提案の著者:デニスウィリアムソン):

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

答え3

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

私が本当に望むのは、端末が最初の列以外の場所でプロンプトを印刷し始めると改行文字が追加されることです。これを行うには、現在使用中の列を取得する方法を理解する必要があります。この回答得るために。最終操作プロンプトの構成は次のとおりです。

###
# 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"

答え4

に固執すると、cat最後に改行文字があるかどうかにかかわらず、両方の種類のファイルで動作します。

echo "`cat example.txt`"

cat好きな名前の関数に変換できます(偶数).bashrc

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

関連情報