ただの少しの知識を記録する記事ですが、このトピックは非常に小さいです。しかし、私はそれが面白いと思っており、それを理解し、説明することができます。
行の定義について#
以下のようなリマインダーから始まるものですが、おそらく皆さんは見たことがあるでしょう。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
私はふと疑問に思いました。なぜ 1 行減らすのではなく、元の最後の行を変更するのでしょうか。なぜ print("hello world")\n
と print("hello world")
を区別する必要があるのでしょうか。
これは実際には、行の定義に関連しています(3.206 Line)。
改行文字を含まない 0 個以上の非改行文字のシーケンスと、終端の改行文字。
行は、0 個以上の非改行文字のシーケンスと、終端の改行文字で構成されます。ここでの「終端の改行文字」という言葉に注目してください。これは、posix の定義では行の終わりに改行文字が必要であることを意味します。したがって、正確に言えば、改行文字は行の終わりを表す一部であり、改行文字がない行は行とは見なされません。
したがって、私は上記の操作で元の完全な行から \n
を削除しました。
問題が発生する可能性#
したがって、posix の標準に従うコマンドやソフトウェアでは、行の終わりが \n
であることを確認しています。ファイルの終わりが改行文字でない場合、一部の状況で問題が発生する可能性があります。
ここでは、 wc -l
の例を挙げます:
私の解決策#
- vim や nano などのツールは、ファイルを保存する際に自動的に末尾に空行を追加します。
- VSCode の拡張機能:ファイルを保存する際に、自動的に末尾に改行記号を追加します。
- リンターの拡張機能:pylint などのリンターの拡張機能をインストールすると、行末に改行記号がない場合に自動的に改行記号が追加されます。
- シェルスクリプト:ディレクトリ内のすべてのファイルに対して、行末に改行記号がない場合は自動的に改行記号を追加します。
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
この記事は非常に詳細であり、私のシェルスクリプトの最終的な解決策の説明まで含まれています。 - missing-final-newline / C0304 - Pylint 3.0.0a8-dev0 documentation
Pylint には対応するチェック項目もあります。