私が得るもの:
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
は簡単な仕事をします。任意のファイルをテキストファイルに変換することは、その仕事の一部ではありません。他のいくつかのツールは常に入力をテキストファイルに変換します。表示しているファイルが改行で終わっているかどうかわからない場合は、cat
ではなくawk 1
を実行してみてください。
前のコマンドがカーソルを最後のマージン以外の場所に置いた場合、bashに次の行にプロンプトを表示させることができます。これを.bashrc
に入れます(バリエーション GetFreeによる 提案 Denis Williamsonによる ):
shopt -s promptvars
PS1='$(printf "%$((COLUMNS-1))s\r")'$PS1
私は次の方法を好みます...
cat example.txt ; echo
これはexample.txt
の内容を評価したり、時々改行を追加したりしません。猫が終わったら改行をエコーするだけで覚えやすく、強い引用と弱い引用のどちらを正しく使用しているかについて誰も考えていません。
唯一の欠点は、実際には、ファイルに独自の末尾改行がある場合、余分な改行が取得されることです。
私は@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"
これに関する問題は、example.txtのファイルの最後に改行がないことです。
cat
の使用を主張する場合、これは両方のタイプのファイルで機能し、末尾に改行がある場合とない場合があります。
echo "`cat example.txt`"
.bashrc
で、選択した名前(cat
も含む)を持つ関数に変換できます。
cat1(){ echo "`/bin/cat $@`";}
.bashrcにも追加できます
Prompt_COMMAND="printf '\n';$Prompt_COMMAND"
私のために働く。