uptime
为什么在文件末尾没有换行符的情况下,shell 脚本中的最后一个命令行(如下)可以成功执行?
例如:
root@jcdb:/tmp#
root@jcdb:/tmp#
root@jcdb:/tmp# cat dp
date
pwd
uptimeroot@jcdb:/tmp#
root@jcdb:/tmp#
root@jcdb:/tmp#
root@jcdb:/tmp# ./dp
Wed Jun 6 16:27:26 EAT 2018
/tmp
4:27pm up 1 day, 17:25, 2 users, load average: 0.39, 0.40, 0.41
root@jcdb:/tmp#
root@jcdb:/tmp#
当 shell 读取 shell 脚本时,它的扫描代码将接受脚本末尾的最后一个单词,即使没有终止换行符。
这是POSIX 标准中关于 shell 如何识别其输入中的标记的第一条规则的效果:
它说当前标记在此处分隔的事实意味着脚本中的最后一个单词以及该非终止行的其余部分将被接受为解释器的输入,而不是导致错误或将 shell 放入一个未定义的状态。
在评论中,引用了
vi
编辑器。允许标准vi
编辑器编辑最后一行未由换行符终止的文件。但是,当将缓冲区写入文件时,它将用换行符终止缓冲区的最后一行(保存空文件时除外,在这种情况下明确不允许添加换行符)。ex
对于标准编辑器也是如此:编辑器
vim
有一个设置,eol
决定它是否应该保留未终止的最后一行。默认行为是终止最后一行。见:help eol
中vim
。标准
ed
编辑器的输入应该是一个文本文件,这意味着如果编辑一个文件的最后一行没有正确终止(这使得它不是文本文件)在技术上是未指定的,会发生什么。在 OpenBSD 上,ed
编辑器在打开非终止文本文件时会说“添加了换行符”。