为什么 'cat' 命令只有一个输出带有换行符?

Why does only one output of the 'cat' command come with a linebreak?

由于我的声誉太低 post 图像我将复制终端 我的问题来源的输出:

username@computer:/run$ cat rsyslogd.pid 
599username@computer:/run$ cat acpid.pid 
636
username@computer:/run$

cat acpid.pid 带有换行符,而 cat rsyslog.pid 没有。

但是如果我打开这两个文件,则没有明显的区别(例如文件 acpid.pid 没有额外的空行)

问题是:为什么一个 .pid 文件带有换行符而另一个没有?

附加信息:我的操作系统是 Ubuntu 18.04.3

rsyslogd.pid 文件可能没有以换行符 (ASCII 0x0A) 结尾。

您没有提到您是如何打开文件的,但是,我怀疑您使用的文本编辑器不会显示非 printable 字符(如换行符和退格键)。不要使用文本编辑器,而是尝试使用 hexdump 工具查看原始文件。然后将十六进制值与 ASCII table 进行比较。我想你会发现599和636后面的non-printable字符是不一样的

hexdump -C rsyslogd.pid
hexdump -C acpid.pid

以下命令序列重现了您的输出。关键是使用 echo 命令的 -n 标志来创建一个末尾没有换行符的文件。

$ echo -n test > file_no_new_line.txt
$ echo test > file_with_new_line.txt
$ cat file_no_new_line.txt
test$ cat file_with_new_line.txt
test
$

这是我示例中显示的两个文件的 hexdump 输出。

$ hexdump -C file_no_new_line.txt
00000000  74 65 73 74                                       |test|
00000004
$ hexdump -C file_with_new_line.txt
00000000  74 65 73 74 0a                                    |test.|
00000005
$

命令输出(在本例中来自 cat)和 shell 提示符($)运行 相互之间也是 shell 相关的。如果无法通过上述步骤重现该行为,请尝试另一个 shell(例如 /bin/sh)