リモートファイルシステムに、短いテキスト文字列(1行の数字のシーケンス)が含まれていることがわかっているファイルがあります。 nanoやEmacsなどのテキストエディタでファイルを開くと、文字列が表示されます。また、これが関連するかどうかはわかりませんが、ls
はファイルが8バイト*であることを報告します。
奇妙なことに、このファイルをcat
すると、cat
は何も報告しません。
ただし、行末に改行を追加すると、cat
に内容が表示されるので、混乱することに気づきました。
だから私の質問は:
cat
に内容を出力させるには、各行の終わりに改行が本当に必要ですか?これはcat
のデフォルトの動作ですか? (もしそうなら、その背後にある理由は何ですか?)cat
にファイル内のすべてを強制的に印刷する方法はありますか?以下の回答に基づいて、プロンプトをどのように定義したかを投稿することが適切だと思いました。私はzsh
にいますが、~/.zshrc
に次の2行があります。
export PS1="%{$fg[white]%}%n%{$reset_color%} @ %{$fg[green]%}%m: %{$fg[yellow]%}%~ %{$reset_color%}%%
> "
プロンプトを定義する前に、シェルでカラーエイリアスを使用できると思う次の2行があります。
autoload -U colors
colors
上記を念頭に置いて、プロンプトで改行を取得し、それでもcat
を取得して上記のようなファイルを正しく印刷するにはどうすればよいですか?
*ランダムファイルをtouch
すると、ls
はファイルが0バイトしかないことを報告するので、ls
が私のファイルが8バイトであることを報告するという事実は意味があると思います。しかし、これが役立つかどうかはわかりません。
Zshは、プロンプトの前にCRを自動的に出力するため、プロンプトは既知の場所から開始できます。 zsh以外のシェルを使用した場合は、次のようになることに注意してください。
$ cat file
12345678$ _ <-- your Prompt after the file contents
これがこの問題に関するFAQエントリです: http://zsh.sourceforge.net/FAQ/zshfaq03.html#l4
テキストファイルは、この理由やその他の理由で改行で終わることになっています-テキストファイルを作成するためのツールを見つけるのは珍しいです(クロスプラットフォーム環境を除いて-Windowsのメモ帳はファイルを改行で終わらせません例)
ほとんどのコマンドの出力後(Windowsの場合のように)プロンプトの前に余分な空白行を許容できる場合は、プロンプトの先頭に改行を追加してみてください。
export PS1="
%{$fg[white]%}%n%{$reset_color%} @ %{$fg[green]%}%m: %{$fg[yellow]%}%~ %{$reset_color%}%%
> "
そして(たぶん、それがオンになっていても実際に機能するかもしれません)Prompt_crShellオプションを無効にします。リンクされた電子メールから「スペースの行」オプションを試すこともできます。
私の推測では、あなたのシェルプロンプトは猫が書いた行を上書きしていると思います。次のことを試して、それが当てはまるかどうかを確認してください。
cat file; echo
シェルによっては、構成ファイルを何らかの方法で微調整して、これが発生しないようにすることができます。
printf %q "$PS1"
の場合、\r
(キャリッジリターン)文字は表示されますか? cat
は改行なしで文字列を出力し、$PS1
が処理されると、行の先頭に戻り、値の上書きに進みます。これが当てはまるかどうかを間接的に確認するには、プロンプトよりも長いの値をファイルに書き込んで(またはプロンプトをファイルの先頭にコピーして)、 cat
出力はプロンプトを通過します。
シェルからecho $PS1
を実行すると、行のどこかに\r
があるかどうかを確認できます。もしそうなら、それが犯人です。
この問題を修正するには、プロンプトの先頭に\n
を追加します。
別のコマンドにキャットする必要がある場合は、ハイジャックされることを恐れずに行うことができます。コマンドラインで表示するには、cat file | less
を実行することもできます。
PS1を次のように定義します。
PS1='\n\u@\h \w\n(\\$\\$='$$') \! \$ '
だから私のプロンプトはこのように見えます
...output of last command
glennj@machine ~
($$=29608) 1403 $
前に空白行があります。したがって、末尾に改行がない出力がある場合でも、それは表示されます。
glennj@auds916 ~
($$=29608) 1403 $ printf hello
hello
glennj@auds916 ~
($$=29608) 1404 $