web-dev-qa-db-ja.com

私のプロンプト定義とzshのcatの間の競合

リモートファイルシステムに、短いテキスト文字列(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オプションを無効にします。リンクされた電子メールから「スペースの行」オプションを試すこともできます。

7
Random832

私の推測では、あなたのシェルプロンプトは猫が書いた行を上書きしていると思います。次のことを試して、それが当てはまるかどうかを確認してください。

cat file; echo

シェルによっては、構成ファイルを何らかの方法で微調整して、これが発生しないようにすることができます。

5

printf %q "$PS1"の場合、\r(キャリッジリターン)文字は表示されますか? catは改行なしで文字列を出力し、$PS1が処理されると、行の先頭に戻り、値の上書きに進みます。これが当てはまるかどうかを間接的に確認するには、プロンプトよりも長いの値をファイルに書き込んで(またはプロンプトをファイルの先頭にコピーして)、 cat出力はプロンプトを通過します。

3
l0b0

シェルからecho $PS1を実行すると、行のどこかに\rがあるかどうかを確認できます。もしそうなら、それが犯人です。

この問題を修正するには、プロンプトの先頭に\nを追加します。

別のコマンドにキャットする必要がある場合は、ハイジャックされることを恐れずに行うことができます。コマンドラインで表示するには、cat file | lessを実行することもできます。

2
k.parnell

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 $
0
glenn jackman