it-swarm-id.com

Apa gunanya menambahkan baris baru ke akhir file?

Beberapa kompiler (terutama yang C atau C++) memberi Anda peringatan tentang:

No new line at end of file

Saya pikir ini akan menjadi masalah C-programer saja, tetapi github menampilkan pesan dalam tampilan komit:

\ No newline at end of file

untuk file PHP.

Saya mengerti hal preprocessor yang dijelaskan dalam tas ini , tetapi apa hubungannya dengan PHP? Apakah itu sama include() hal atau apakah itu terkait dengan topik \r\n Vs \n?

Apa gunanya memiliki baris baru di akhir file?

197
Philipp Stephan

Ini bukan tentang menambahkan baris baru ekstra di akhir file, ini tentang tidak menghapus baris baru yang seharusnya ada di sana.

A file teks , di bawah unix, terdiri dari serangkaian baris , yang masing-masing diakhiri dengan karakter baris bar (\n). Karena itu file yang tidak kosong dan tidak diakhiri dengan baris baru bukanlah file teks.

Utilitas yang seharusnya beroperasi pada file teks mungkin tidak dapat mengatasi dengan baik file yang tidak diakhiri dengan baris baru; Utilitas historis Unix mungkin mengabaikan teks setelah baris baru terakhir, misalnya. GNU utilitas memiliki kebijakan berperilaku sopan dengan file non-teks, dan begitu juga sebagian besar utilitas modern lainnya, tetapi Anda mungkin masih menemukan perilaku aneh dengan file yang kehilangan baris akhir akhir¹.

Dengan GNU diff, jika salah satu file yang dibandingkan diakhiri dengan baris baru tetapi tidak yang lain, berhati-hatilah untuk mencatat fakta tersebut. Karena diff berorientasi garis, ia tidak dapat menunjukkan ini dengan menyimpan baris baru untuk salah satu file tetapi tidak untuk yang lain - baris baru diperlukan untuk menunjukkan di mana setiap baris dalam file diff dimulai dan diakhiri. Jadi beda menggunakan teks khusus ini \ No newline at end of file untuk membedakan file yang tidak berakhir pada baris baru dari file yang melakukannya.

By the way, dalam konteks C, file sumber juga terdiri dari serangkaian baris. Lebih tepatnya, unit terjemahan dilihat dalam implementasi-didefinisikan sebagai serangkaian garis, yang masing-masing harus diakhiri dengan karakter baris baru ( n1256 §5.1.1.1). Pada sistem unix, pemetaannya mudah. Pada DOS dan Windows, setiap CR LF urutan (\r\n) dipetakan ke baris baru (\n; inilah yang selalu terjadi ketika membaca file dibuka sebagai teks pada OS ini). Ada beberapa OS di luar sana yang tidak memiliki karakter baris baru, tetapi sebaliknya memiliki catatan berukuran tetap atau variabel; pada sistem ini, pemetaan dari file ke sumber C memperkenalkan \n di akhir setiap catatan. Meskipun ini tidak secara langsung relevan dengan unix, itu berarti bahwa jika Anda menyalin file sumber C yang kehilangan baris terakhir terakhirnya ke sistem dengan file teks berbasis catatan, lalu menyalinnya kembali, Anda akan berakhir dengan yang tidak lengkap baris terakhir terpotong di konversi awal, atau baris baru tambahan ditempelkan selama konversi terbalik.

¹ Contoh: output dari GNU sort selalu berakhir dengan baris baru. Jadi jika file foo tidak ada di baris terakhir, Anda akan menemukan bahwa sort foo | wc -c melaporkan satu karakter lebih dari cat foo | wc -c.

Tidak harus alasannya, tetapi konsekuensi praktis dari file tidak berakhir dengan baris baru:

Pertimbangkan apa yang akan terjadi jika Anda ingin memproses beberapa file menggunakan cat. Misalnya, jika Anda ingin menemukan Word foo pada awal baris di 3 file:

cat file1 file2 file3 | grep -e '^foo'

Jika baris pertama dalam file3 dimulai dengan foo, tetapi file2 tidak memiliki akhir \n setelah baris terakhir, kejadian ini tidak akan ditemukan oleh grep, karena baris terakhir di file2 dan baris pertama di file3 akan dilihat oleh grep sebagai satu baris.

Jadi, untuk konsistensi dan untuk menghindari kejutan saya mencoba untuk menjaga file saya selalu berakhir dengan baris baru.

48
Sergio Acosta

Ada dua aspek:

  1. Ada/ada beberapa kompiler C yang tidak dapat menguraikan baris terakhir jika tidak diakhiri dengan baris baru. Standar C menentukan bahwa file C harus diakhiri dengan baris baru (C11, 5.1.1.2, 2.) dan bahwa baris terakhir tanpa baris baru menghasilkan perilaku yang tidak terdefinisi (C11, J.2, item ke-2). Mungkin karena alasan historis, karena beberapa vendor kompiler seperti itu adalah bagian dari komite ketika standar pertama ditulis. Demikian peringatan dari GCC.

  2. diff program (seperti yang digunakan oleh git diff, github dll.) menunjukkan perbedaan baris demi baris antara file. Mereka biasanya mencetak pesan ketika hanya satu file yang diakhiri dengan baris baru karena jika tidak, Anda tidak akan melihat perbedaan ini. Sebagai contoh jika satu-satunya perbedaan antara dua file adalah keberadaan karakter baris baru terakhir, tanpa petunjuk itu akan terlihat seperti kedua file itu sama, ketika diff dan cmp mengembalikan sebuah pintu keluar- kode keberhasilan tidak sama dan checksum dari file (misalnya via md5sum) tidak cocok.

17
maxschlepzig

\ No newline at end of file Anda dapatkan dari github muncul di akhir tambalan (dalam diff format , lihat catatan di akhir "Unified Format" "bagian).

Compiler tidak peduli apakah ada baris baru atau tidak di akhir file, tetapi git (dan utilitas diff/patch) harus mempertimbangkan yang ada di akun . Ada banyak alasan untuk itu. Misalnya, lupa menambahkan atau menghapus baris baru di akhir file akan mengubah hashsumnya (md5sum/sha1sum). Selain itu, file tidak selalu merupakan program, dan akhir \n mungkin membuat beberapa perbedaan.

Catatan : Tentang peringatan dari kompiler C, saya kira mereka bersikeras untuk baris baru akhir untuk tujuan kompatibilitas mundur. Kompiler yang sangat lama mungkin tidak menerima baris terakhir jika tidak diakhiri dengan \n (atau urutan karakter end-of-line yang bergantung pada sistem).

12

Ada juga titik menyimpan perbedaan sejarah. Jika file berakhir tanpa karakter baris baru, maka menambahkan apa pun ke akhir file akan dilihat oleh utilitas berbeda sebagai mengubah baris terakhir (karena \n sedang ditambahkan ke dalamnya).

Ini dapat menyebabkan hasil yang tidak diinginkan dengan perintah seperti git blame dan hg annotate.

6
Hosam Aly

POSIX, ini adalah seperangkat standar yang ditentukan oleh IEEE untuk menjaga kompatibilitas antara sistem operasi.

Salah satunya adalah definisi "garis" menjadi urutan nol atau lebih non-karakter plus karakter baris baru yang berakhir.

Jadi agar baris terakhir itu dikenali sebagai "garis" aktual, ia harus memiliki karakter baris baru yang diakhiri.

Ini penting jika Anda bergantung pada alat OS untuk mengatakan jumlah baris atau membagi/membantu mem-parsing file Anda. Diberikan PHP adalah bahasa skrip, sepenuhnya mungkin terutama pada hari-hari awal atau bahkan sekarang (saya tidak tahu/mendalilkan) itu dependensi OS seperti itu.

Pada kenyataannya, sebagian besar sistem operasi tidak sepenuhnya memenuhi persyaratan POSIX dan manusia tidak menyukai mesin itu atau bahkan peduli untuk menghentikan jalur baru. Jadi untuk sebagian besar hal itu merupakan hamparan segala sesuatu baik itu peduli, peringatan atau hanya pergi bahwa bit terakhir dari teks benar-benar sebuah baris jadi sertakan saja.

4
user3379747