zsh 中我的提示定义和 cat 之间的冲突

Ame*_*ina 7 command-line shell prompt zsh cat

我在远程文件系统上有一个文件,我知道其中有一个短文本字符串(一行中的数字序列)。如果我在文本编辑器(如 nano 或 Emacs)上打开文件,我可以看到字符串。此外,不确定这是否相关,但ls报告文件有 8 个字节*。

奇怪的是,如果我cat这个文件,cat什么都不报告。

但是,我注意到如果在行尾添加换行符,cat则会显示内容,这让我感到困惑。

所以我的问题是:

  • 为什么会发生这种情况?我真的需要在每行末尾换行才能cat打印其内容吗?这是默认行为cat吗?(如果是,背后的原因是什么?)
  • 有没有办法强制cat打印文件中的所有内容,无论我是否有换行符?

更新:

根据下面的答案,我认为发布我如何定义我的提示是相关的。我在zsh,我有以下两行~/.zshrc

export PS1="%{$fg[white]%}%n%{$reset_color%} @ %{$fg[green]%}%m: %{$fg[yellow]%}%~ %{$reset_color%}%%
> "
Run Code Online (Sandbox Code Playgroud)

在定义我的提示之前,我有以下两行,我相信它们使我能够在 shell 中使用颜色别名:

autoload -U colors
colors
Run Code Online (Sandbox Code Playgroud)

重新表述问题:

考虑到上述情况,如何在我的提示中获得换行符,并且仍然设法cat正确打印上述文件?


*如果我touch是一个随机文件,ls报告该文件只有 0 个字节,所以我认为ls报告我的文件有 8 个字节的事实是有意义的。不确定这是否有帮助。

Ran*_*832 7

Zsh 在提示之前自动输出一个 CR,以便提示可以从已知位置开始。请注意,如果您使用 zsh 以外的 shell,您将获得:

$ cat file
12345678$ _ <-- your prompt after the file contents
Run Code Online (Sandbox Code Playgroud)

这是有关该问题的常见问题解答条目: //zsh.sourceforge.net/FAQ/zshfaq03.html#l40

出于这个原因和其他原因,文本文件应该以换行符结尾 - 找到一种创建它们的工具而不包含一个换行符是不寻常的(跨平台环境除外 - Windows 记事本不会以换行符结束文件)例子)

如果您可以在大多数命令的输出(如在 Windows 上)在提示之前容忍一个额外的空行,请尝试在提示的开头添加一个换行符:

export PS1="
%{$fg[white]%}%n%{$reset_color%} @ %{$fg[green]%}%m: %{$fg[yellow]%}%~ %{$reset_color%}%%
> "
Run Code Online (Sandbox Code Playgroud)

并且(也许,即使打开它也可能实际工作)禁用 prompt_cr shell 选项。您还可以尝试链接电子邮件中的“空格行”选项。


Sté*_*nez 5

我的猜测是您的 shell 提示覆盖了 cat 写的行。请尝试以下操作来检查是否是这种情况:

cat file; echo
Run Code Online (Sandbox Code Playgroud)

根据您的 shell,您可以以某种方式调整您的配置文件,以确保这永远不会发生。