私が得るもの:
host:~ user$ cat example.txt
some texthost:~ stas$
私が取得したいもの:
host:~ user$ cat example.txt
some text
host:~ stas$
cat
このように動作させる方法はありますか?
Mac OS Xでbashを使用しています。
私が得るもの:
host:~ user$ cat example.txt
some texthost:~ stas$
私が取得したいもの:
host:~ user$ cat example.txt
some text
host:~ stas$
cat
このように動作させる方法はありますか?
Mac OS Xでbashを使用しています。
回答:
ほとんどのUNIXツールは、テキストファイルで適切に動作するように設計されています。テキストファイルは、一連の行で構成されます。行は、改行文字で終わる印刷可能な文字のシーケンスで構成されます。特に、空でないテキストファイルの最後の文字は常に改行文字です。明らかに、最後の改行なしでexample.txt
のみ含まれsome text
ているため、テキストファイルではありません。
cat
簡単な仕事をします。任意のファイルをテキストファイルに変換することは、その仕事の一部ではありません。他のいくつかのツールは、入力を常にテキストファイルに変換します。表示しているファイルが改行で終わるかどうかわからない場合は、のawk 1
代わりに実行してくださいcat
。
前のコマンドが最後のマージン以外の場所にカーソルを置いた場合、bashのプロンプトを次の行に表示させることができます。これをあなたの.bashrc
(Denis Williamsonによる提案のGetFreeによるバリエーション)に入れてください:
shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1
PROMPT_COMMAND
必要があり、0でない場合は\n
、の最初の文字として改行()を使用する必要があることがわかりましたPS1
。
@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 /programming//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"
__get_terminal_column
?
PS1="\n"
がecho
ありますPS1
。
問題は、ファイルの最後にexample.txtの改行がないことです。
cat
仕事ではないことを理解しているので、おそらくいくつかの回避策を探しています。
example.txt
、ファイルの最後に改行がないという無回答です。これが質問の要点です。
を使用する場合cat
は、最後に改行がある場合とない場合の両方のタイプのファイルで機能します。
echo "`cat example.txt`"
あなたはあなたの選択の名前(でさえcat
)を持つ関数にそれを変えることができます.bashrc
:
cat1(){ echo "`/bin/cat $@`";}
cat
ので、この問題が再び私を悩ませ始めたときの最後の手段としてこれを維持します。