ฉันมีปัญหาในการทำความเข้าใจกับพฤติกรรมแปลก ๆ : vi ดูเหมือนว่าจะเพิ่มขึ้นบรรทัดใหม่ (ASCII: LF เนื่องจากเป็นระบบ Unix ( AIX )) ที่ท้ายไฟล์เมื่อฉันไม่ได้พิมพ์เฉพาะเจาะจง
ฉันแก้ไขไฟล์ดังกล่าวใน vi (ระวังที่จะไม่ป้อนบรรทัดใหม่ในตอนท้าย):
# vi foo ## Which I will finish on the char "9" and not input a last newline, then `:wq`
123456789
123456789
123456789
123456789
~
~
## When I save, the cursor is just above the last "9", and no newline was added.
ฉันคาดหวังว่า vi จะบันทึก "ตามสภาพ" ดังนั้นต้องมี 39 ไบต์: 10 อักขระ ASCII ในแต่ละสามบรรทัดแรก (หมายเลข 1 ถึง 9 ตามด้วยบรรทัดใหม่ (LF ในระบบของฉัน)) และเพียง 9 รายการสุดท้าย บรรทัด (อักขระ 1 ถึง 9 ไม่ต้องยกเลิกบรรทัดใหม่ / LF)
แต่มันปรากฏขึ้นเมื่อฉันบันทึกมันเป็น40ไบต์ (แทน 39) และod แสดงการสิ้นสุด LF :
# wc foo
4 4 40 foo ## I expected 39 here! as I didn't add the last newline
# od -a toto
0000000 1 2 3 4 5 6 7 8 9 lf 1 2 3 4 5 6
0000020 7 8 9 lf 1 2 3 4 5 6 7 8 9 lf 1 2
0000040 3 4 5 6 7 8 9 lf
0000050
## An "lf" terminates the file?? Did vi add it silently?
ถ้าฉันสร้างไฟล์โดย printf ทำสิ่งที่ฉันทำใน vi มันทำงานได้ตามที่คาดไว้:
# ## I create a file with NO newline at the end:
# printf "123456789\n123456789\n123456789\n123456789" > foo2
# wc foo2 ## This one is as expected: 39 bytes, exactly as I was trying to do above with vi.
3 4 39 foo ## As expected, as I didn't add the last newline
## Note that for wc, there are only three lines!
## (So wc -l doesn't count lines; it counts the [newline] chars... Which is rather odd.)
# root@SPU0WMY1:~ ## od -a foo2
0000000 1 2 3 4 5 6 7 8 9 lf 1 2 3 4 5 6
0000020 7 8 9 lf 1 2 3 4 5 6 7 8 9 lf 1 2
0000040 3 4 5 6 7 8 9
0000047 ## As expected, no added LF.
ทั้งไฟล์ (foo (40 ตัวอักษร) และ foo2 (39 ตัวอักษร) จะเหมือนกันทุกประการถ้าฉันเปิดไฟล์ใหม่ด้วย vi ...
และถ้าฉันเปิด foo2 (39 ตัวอักษรไม่ต้องขึ้นบรรทัดใหม่) ใน vi และทำ:wq
โดยไม่ต้องแก้ไขใด ๆมันบอกว่ามันเขียน 40 ตัวอักษรและ linefeed จะปรากฏขึ้น!
ฉันไม่สามารถเข้าถึง vi ที่ใหม่กว่าได้ (ฉันทำสิ่งนี้บน AIX, vi (ไม่ใช่Vim ) รุ่น 3.10 ฉันคิดว่า (ไม่มี "-version" หรือวิธีการอื่นที่รู้)
# strings /usr/bin/vi | grep -i 'version.*[0-9]'
@(#) Version 3.10
เป็นเรื่องปกติสำหรับ vi (และอาจไม่ใช่ในเวอร์ชันที่ใหม่กว่านี้หรือ Vim?) เพื่อเพิ่มบรรทัดใหม่ที่ส่วนท้ายของไฟล์อย่างเงียบ ๆ ? (ฉันคิดว่า ~ ระบุว่าบรรทัดก่อนหน้าไม่ได้ขึ้นบรรทัดใหม่)
-
แก้ไข:การอัปเดตเพิ่มเติมบางส่วนและการสรุปโดยขอขอบคุณคำตอบด้านล่าง:
vi เพิ่มบรรทัดใหม่ที่ต่อท้ายในขณะที่มันเขียนไฟล์ที่ขาดมัน (ยกเว้นว่าไฟล์นั้นว่างเปล่า)
มันจะทำในเวลาที่เขียนเท่านั้น! (กล่าวคือจนกว่าคุณจะ: คุณสามารถใช้: e เพื่อตรวจสอบว่าไฟล์ยังคงเป็นเมื่อคุณเปิดมัน ... (เช่น: มันยังคงแสดง "ชื่อไฟล์" [บรรทัดสุดท้ายยังไม่สมบูรณ์] N บรรทัด, อักขระ M) เมื่อคุณบันทึกจะมีการเพิ่มขึ้นบรรทัดใหม่โดยไม่แจ้งเตือนใด ๆ (มันบอกว่าบันทึกได้กี่ไบต์ แต่ในกรณีส่วนใหญ่ไม่เพียงพอที่จะรู้ว่ามีการเพิ่มบรรทัดใหม่) (ขอบคุณ @jiliagre ที่พูดกับฉันเกี่ยวกับ การเปิดข้อความ vi มันช่วยให้ฉันค้นหาวิธีที่จะรู้ว่าเมื่อการเปลี่ยนแปลงเกิดขึ้นจริง)
นี่คือการแก้ไขแบบPOSIX ! (ดู @ barefoot-io คำตอบสำหรับการอ้างอิง)
vi
เวอร์ชันหรืออย่างน้อยก็มีเงื่อนงำเกี่ยวกับที่มาของมันโดยการรัน:ve
คำสั่ง
ex
หน้าคู่มือซึ่ง:ver
ปกติคำสั่งจะมีการจัดทำเป็นเอกสาร