Как nano и vim работают с файлами

Опубликовано 4 мар. 2026 г.

Вчера в чатике интересный комментарий пролетел:

Если открыть файл в vim, то lsof покажет этот файл открытым. А вот если открыть файл в nano, то lsof не факт, что покажет этот файл открытым. Ну видимо nano не постоянно держит открытым файл.

ЧИТАТЬ ПЕРВЫМ В ТЕЛЕГРАМ   ЧИТАТЬ ПЕРВЫМ В MAX

Давай покопаем глубже и посмотрим что происходит. Расчехляем лабу!

В первом терминале запускаем:

echo "secret data" > test.txt
nano test.txt

Во втором запускаем глазища:

sudo strace -e open,openat,write,close -p $(pgrep nano)

Пока пусто. Теперь в первом терминале нажимаем CTRL+O и смотрим выхлоп во втором терминале:

openat(AT_FDCWD, "test.txt", O_WRONLY|O_TRUNC) = 3  
write(3, "secret data\n", 5) = 5  
close(3) = 0

Получается nano запихивает весь файл в RAM и только после манипуляций с ним производит запись на диск, то есть не держит его постоянно открытым. По этой причине lsof ничего и не показывает.

Теперь идем в vim и повторяем предыдущие команды:

vim test.txt

Но во втором терминале запускаем:

watch -n 0.01 "lsof | grep test.txt"

И сразу же видим что lsof показывает открытые файлы:

vim 6423 user 5u REG 8,48 12288 11148 /tmp/.test.txt.swp
vim 6423 6424 vim user 5u REG 8,48 12288  11148 /tmp/.test.txt.swp

Но это не сам файл test.txt, это его swap версия, то есть создается еще один файл. Если открыть такой файл, то в нем будет мусор:

0000000 3062 4956 204d 2e39 0031 0000 1000 0000
0000010 bfdc 69a7 b9a1 0000 1917 0000 7375 7265
0000020 0000 0000 0000 0000 0000 0000 0000 0000

Этот файл, vim использует для crash recovery, undo history, file already open, incremental writes и т.п. Получается что vim постоянно держит открытый swap, а не исходный файл.

Если выполнить:

lsof -p 6423

То увидим всю подноготную этого процесса включая дескрипторы.

Ну и финт ушами. В первом терминале выполняем:

vim test.txt

Во втором:

mv test.txt test.old

И видим что vim грязно выругался: E211: File "test.txt" no longer available.

А если все то же самое проделать с nano то он даже не пискнет, потому что файл загружен в память и ему похеру что мы физически снесли файл с диска. Можно снова нажать CTRL+O и он даже предложит нам его сохранить со старым именем.

Вот тут уже можно почесать репу, получается nano работает быстрее чем vim? Неа, vim тоже загружает файл в память (buffer ram). А swap файл это всего лишь журнал изменений либо undo-файлы. Swap не заменяет память, он выступает в роле дополнительного инструмента.

Схема для vim такая:

disk file → RAM buffer (vim)
            swap file (.swp)

Схема для nano попроще:

disk file → RAM buffer

В nano нет ни рекавери, не другой подобной хуйни-муйни. Ну а по скорости, разницы практически нет (если файлы небольшие), файлы читаются один раз, оба редактора работают в памяти, ну а linux page cache делает чтение еще быстрее.

Если файлы большие, vim все же предпочтительнее, у него более продвинутый механизм по работе с буферами.

Так и живем!

Комментарии