head -c 3 sample.txt
输出将显示在提示中的用户名之前。
Theuser@localhost:/home$
The
之后不再打印$
。
为什么我的终端会这样做?
答案1
The
之后没有被打印$
为什么应该这样?head
首先打印,然后 shell 提示您输入下一个命令。尽管期望在单独的行中出现提示是有点合理的,但仍然后(以下)The
。
head -c 3 sample.txt
准确打印The
并且之后没有换行符e
。您请求head
将 3 个字节打印到其标准输出(即本例中的终端),并且您恰好得到了 3 个字节。其中没有换行符。
通常,命令(例如echo
)的文本输出以换行符结尾。当 shell 在命令终止后打印提示时,它会在换行符之后立即打印,因此您会在新行的开头看到提示。
在您的情况下,之后没有换行符The
,因此当 shell 打印到终端时,提示符出现在同一行中。
有些 shell 会检测到这种情况即将发生. 你的 shell 显然没有。
处理行的工具会用尾随换行符打印它们,因为这些字符实际上属于各自的行。源数据中最后一行(例如 )不完整(即没有尾随换行符)的情况sample.txt
可以通过忽略该行或按原样打印(没有换行符)或通过修复(添加换行符)来处理;这取决于工具及其实现。
从sample.txt
包含完整的行以及head -n
处理行,您可以期待完整的行。但是head -c
处理字节,除非您事先知道要打印的最后一个字节是换行符,否则您不应该假设输出的最后一行是完整的。
echo
您可以通过在之后不带参数调用来轻松添加换行符head
:
head -c 3 sample.txt; echo
然后您的提示几乎*肯定会出现在单独的行中。只要记住这一换行符来自echo
,而不是来自sample.txt
。
* 例外情况是,当输出head
包含移动光标等的终端控制序列时。我不希望此类序列适合三个字节,但一般来说,如果文件包含它们,并且终端是否理解它们,并且如果您请求足够的字节,然后终端将服从。如果发生这种情况,则可以在任何地方看到提示(或者更糟)