У мене виникають проблеми з розумінням дивної поведінки: начебто vi додає новий рядок (ASCII: LF, оскільки це система Unix ( AIX )) в кінці файлу, коли я НЕ спеціально його вводив.
Я редагую файл як такий in 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 символів) виглядають абсолютно однаково, якщо я повторно відкрию їх за допомогою ...
І якщо я відкрию foo2 (39 символів, не закінчуючи новий рядок) у vi і просто виконую, :wq
не редагуючи його , він каже, що він пише 40 символів, і з'являється лінійка!
Я не можу отримати доступ до більш нової версії vi (я це роблю на AIX, vi (не Vim ) версії 3.10, я думаю? (Немає "-вернення" чи іншого способу її знати)).
# strings /usr/bin/vi | grep -i 'version.*[0-9]'
@(#) Version 3.10
Чи нормально vi (а може бути, і не в останній версії? Чи Vim?) Мовчки додавати новий рядок у кінці файлу? (Я подумав, що ~ вказав, що попередній рядок НЕ закінчувався новим рядком.)
-
Редагувати: кілька додаткових оновлень і короткий підсумок, велике спасибі за відповіді нижче:
vi мовчки додайте зворотний новий рядок у момент, коли він записує файл, якого йому бракувало (якщо файл не порожній).
це робиться лише під час написання! (тобто, поки ви: w, ви можете використовувати: e, щоб переконатися, що файл все-таки такий, як ви його відкрили ... (тобто: він все ще показує "ім'я файлу" [Останній рядок не завершений] N рядок, M-символ). Коли ви зберігаєте, новий рядок додається безшумно, без конкретного попередження (він говорить про те, скільки байтів він зберігає, але цього в більшості випадків недостатньо, щоб знати новий рядок) (спасибі @jiliagre, що розмовляв зі мною про відкриваючи повідомлення vi, це допомогло мені знайти спосіб дізнатися, коли зміна насправді відбувається)
Це (тиха корекція) поведінка POSIX ! (див. відповідь @ босоніж-йо для довідок)
vi
версію або хоча б підказку про її походження, запустивши :ve
команду.
ex
сторінку керівництва, де :ver
командування зазвичай задокументоване.