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 di utas ini , tetapi apa hubungannya dengan PHP? Apakah hal yang sama include()
atau terkait dengan topik \r\n
vs \n
?
Apa gunanya memiliki baris baru di akhir file?
cat
file, prompt berikutnya akan ditambahkan ke "baris" akhir jika tidak diakhiri dengan baris baru.Jawaban:
Ini bukan tentang menambahkan baris baru ekstra di akhir file, ini tentang tidak menghapus baris baru yang seharusnya ada di sana.
Sebuah file teks , di bawah unix, terdiri dari serangkaian garis , yang masing-masing berakhir dengan karakter baris baru (
\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 berakhir dengan baris baru; Utilitas historis Unix mungkin mengabaikan teks setelah baris baru terakhir, misalnya. Utilitas GNU 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 baru akhir¹.
Dengan GNU diff, jika salah satu file yang dibandingkan diakhiri dengan baris baru tetapi tidak yang lain, perlu diperhatikan fakta itu. 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 mulai dan berakhir. Jadi diff menggunakan teks khusus ini
\ No newline at end of file
untuk membedakan file yang tidak berakhir pada baris baru dari file yang melakukannya.Omong-omong, 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 urutan CR LF (
\r\n
) dipetakan ke baris baru (\n
; inilah yang selalu terjadi ketika membaca file yang 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 a\n
di akhir setiap rekaman. 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 jenis GNU selalu diakhiri dengan baris baru. Jadi, jika file
foo
tersebut kehilangan baris terakhirnya, Anda akan menemukan bahwasort foo | wc -c
laporan memiliki satu karakter lebih banyak daripadacat foo | wc -c
.sumber
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 katafoo
di awal baris di 3 file: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 diakhiri dengan baris baru.
sumber
'\n'
operasi kucing ...\n
atau spasi kosong di ujungnya, jadi untuk menjaga hal-hal yang konsisten, saya selalu menempatkan\n _____
di kedua ujung string saya." Ya, tidak, hal yang benar untuk dilakukan adalah membuat string Anda dipangkas dan kemudian menggabungkannya dengan benar.Ada dua aspek:
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.
diff
program (seperti yang digunakan olehgit 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, kapandiff
dancmp
mengembalikan kode keluar keberhasilan yang tidak setara dan checksum dari file (misalnya viamd5sum
) tidak cocok.sumber
diff
diharapkan untuk mencetak perbedaan jika ada. Dan jika satu file memiliki baris baru sebagai karakter terakhir sementara yang lain belum maka perbedaan itu entah bagaimana harus terlihat dalam output.\n
) untuk memulainya, ia hanya dapat menampilkan "baris baru".Yang
\ No newline at end of file
Anda dapatkan dari github muncul di akhir tambalan (dalamdiff
format , lihat catatan di akhir bagian "Format Terpadu").Compiler tidak peduli apakah ada baris baru atau tidak di akhir file, tetapi
git
(dandiff
/patch
utilitas) harus memperhitungkannya. Ada banyak alasan untuk itu. Sebagai contoh, lupa untuk menambah atau menghapus baris baru di akhir file akan mengubah hashsum-nya (md5sum
/sha1sum
). Juga, file tidak selalu program, dan final\n
mungkin membuat beberapa perbedaan.Catatan : Tentang peringatan dari kompiler C, saya kira mereka bersikeras untuk baris terakhir final untuk tujuan kompatibilitas ke belakang. Kompiler yang sangat lama mungkin tidak menerima baris terakhir jika tidak diakhiri dengan
\n
(atau urutan karakter end-of-line yang bergantung pada sistem).sumber
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
danhg annotate
.sumber
-w
opsi untuk mengabaikan perubahan spasi putih saat mengeluarkan data untuk manusia.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 mengurai file Anda. Mengingat 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.
sumber