這只是一篇稍微記錄一點知識的文章,這個知識點很小。但其實我覺得挺有趣的,而我又能夠 handle 住並能講清楚的。
關於行的定義#
事情源於下面這樣一個提醒,源於 git diff
,相信大家都是看過的。\No newline at end of file
diff --git a/demo.py b/demo.py
index 8cde782..e75154b 100644
--- a/demo.py
+++ b/demo.py
@@ -1 +1 @@
-print("hello world")
+print("hello world")
\ No newline at end of file
容我思考一個問題,為什麼不是減了一行而是對原有的最後一行進行了修改。為什麼要區分 print("hello world")\n
與 print("hello world")
這其實涉及到了 posix 中對行的定義。(3.206 Line)
A sequence of zero or more non- <newline> characters plus a terminating <newline> character.
行是由一系列零個或多個非 <newline>
字符,以及 一個終止的 <newline>
字符組成的。注意此處的「以及」兩個字,這意味著在 posix 的定義中行是必須有一個 <newline>
作為結尾, 所以準確來說,換行符是終止的行的一部分,沒有換行符的行不算是一行。
所以上面這個操作我是將原來的完整的一行裡面的 \n
給刪除了
可能會導致的問題#
所以嘛,只要遵守 posix 標準的命令或者軟體,都會確保一行的結束是為 \n
才算是真正的一行。要是文件結尾不為換行符,可能在一些情況下會存在問題。
我此處就只舉一個例子 wc -l
:
我的解決方案#
- 像 vim 以及 nono 這種工具,是會在保存文件的時候自動幫你在末尾補空行的。
- vscode 插件:在你保存文件的時候,自動保證最後的換行符號。
- linter 插件:可以裝一些 linter 插件什麼的, 例如 pylint, 在你沒有換行符號結尾的時候自動加換行符。
- shell 腳本:自動給目錄下的所有文件,沒有換行符結尾的話,都加一個換行符。
nini_ensure_newline(){ find . -type f | while read -r file; do if [ "$(tail -c 1 "$file")" != '' ]; then echo "Processing $file" echo "" >> "$file" fi done }
參考資料#
- linux - 什麼時候程序源碼文件末尾要有空行?是怎麼規定和考慮的 - SegmentFault 思否
其實這個鏈接裡面的回答回答了個寂寞,沒有認準 posix 標準這個核心,這個事情跟軟體的新舊無關的。新軟體也可以支持 posix 標準,那也要以換行符作為行的結尾才能將這視為一行。 - How to force newline at end of files and why you should do it | by Alexey Inkin | Medium
講得很詳細,就連我的 shell 代碼的結局方案的解釋都加上了。 - missing-final-newline / C0304 - Pylint 3.0.0a8-dev0 documentation
Pylint 也有對應的檢查項。