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

我的提示符定义和 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%}%%
> "

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

autoload -U colors
colors

重新表述一下问题:

考虑到上述内容,我怎样才能在提示符中获得换行符,并且仍然能够cat正确打印如上所述的文件?


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

答案1

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

$ cat file
12345678$ _ <-- your prompt after the file contents

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

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

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

export PS1="
%{$fg[white]%}%n%{$reset_color%} @ %{$fg[green]%}%m: %{$fg[yellow]%}%~ %{$reset_color%}%%
> "

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

答案2

我的猜测是你的 shell 提示符覆盖了 cat 写入的行。请尝试以下方法检查是否是这样:

cat file; echo

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

答案3

如果是printf %q "$PS1",它是否显示任何\r(回车)字符?这可以解释它:cat输出一些没有换行符的字符串,然后在$PS1处理时,它返回到行的开头并继续覆盖该值。要间接检查是否是这种情况,您可以尝试在文件中写入一个值更长比您的提示符(或者只是将提示符复制到文件的开头),并查看输出是否cat流过提示符。

答案4

我这样定义我的 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 $

相关内容