我在远程文件系统上有一个文件,我知道其中有一个短文本字符串(单行中的数字序列)。如果我在 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 $