![永久解决方案:文件,字符串不\n混合到命令行](https://linux22.com/image/106555/%E6%B0%B8%E4%B9%85%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88%EF%BC%9A%E6%96%87%E4%BB%B6%EF%BC%8C%E5%AD%97%E7%AC%A6%E4%B8%B2%E4%B8%8D%5Cn%E6%B7%B7%E5%90%88%E5%88%B0%E5%91%BD%E4%BB%A4%E8%A1%8C.png)
文件不包含换行符。
文件的最后一行与命令提示符中的用户名混合。
文件:
line 1
测试:
user /: cat file
line 1user /:
建议的解决方案是:向文件添加新的行终止符。
这样的解决方案怎么能算是正确的呢?
这意味着将来如果存储文件没有新的行终止符,它可能会破坏我们的心情。
逻辑会建议..不要相信任何东西。但自己要正确。
所以如果我想正确的话..我永远不应该允许我的用户名出现在某个字符串的末尾,无论它是否有换行符。
我不应该指望他们。
我应该是我自己的实体。
是否有替代解决方案来确保我的用户名永远不会成为“无换行符”文件或字符串的受害者?
也许解决方案不存在,因为它会使其他东西功能失调,例如“尾巴”等?
但必须有一些逻辑。
寻找一些逻辑。
答案1
这样的解决方案怎么能算是正确的呢?
因为的目的cat
其实并不是为了显示文件。这是一个副作用。
目的cat
是为了骗局猫埃纳特文件(因此得名)。它通过依次读取每个文件并将每个文件的内容输出到其标准输出来实现这一点,如果需要,标准输出又可以重定向。
它通常用于cat
简单地显示文件的内容,这是因为默认情况下,进程的标准输出绑定到终端。您还可以使用专用分页器(例如或其less
较早的兄弟more
)来查看文件,因为分页器是故意的用于查看文件。
如果cat
用换行符终止其输出或每个文件的内容,则会破坏其长期合同。它对于实际连接文件不再有用;如果您要获取一个大文件,将其拆分为多个部分,然后使用此类修改后的文件重新连接各个部分cat
,则结果将与您开始时的有所不同。
请记住,UNIX 哲学是让每个工具做一些小事情,做好它,并且以这样的方式完成它:不同的工具可以组合起来形成更大的上下文。这就是为什么我可以执行诸如 ssh'ing 到远程主机来执行命令、将 ssh 会话的输出通过管道传输到本地工具(awk、perl、grep 等)来处理输出,并将结果通过管道传输的原因。例如,lpr
获得硬拷贝打印输出或less
通过来回滚动的能力进行浏览。所有工具都是从标准输出到标准输入,每个工具只做一件事,大多数简单工具(以及许多不那么简单的工具)要么默认遵循此模式,要么可以使用适当的命令遵循该模式- 行参数。
是否有替代解决方案来确保我的用户名永远不会成为“无换行符”文件或字符串的受害者?
是的当然。将提示设置为以换行符开头,如下所示。
$ printf 'hello' > $TMP/hello
$ PS1='\u \W: '
michael ~: cat $TMP/hello
hellomichael ~: PS1='\n\u \W: '
michael ~: cat $TMP/hello
hello
michael ~: