Я использую vim для редактирования файла. Иногда я забываю иметь соответствующие разрешения. Я запускаю vim и файл как файл только для чтения. Я могу внести изменения, но на самом деле я не могу написать изменения. Время от времени я заканчиваю тем, что открывал файл и вносил в него изменения, осознавая, что я не запускал его в sudo, кричал сам себе, а затем принудительно завершал работу и снова открывал его как пользователь root.
Есть ли обходной путь для этого? Могу ли я принудительно внести изменения в файл, несмотря на статус файла только для чтения? Могу ли я хотя бы сохранить изменения, запустить diff и объединить файлы вместе?
linux
vim
terminal
permissions
Андор Кессельман
источник
источник
Ответы:
Кажется, есть несколько разных подходов, в зависимости от вашей текущей проблемы:
:set readonly
вы можете:w!
чтобы заставить писать, или:set noreadonly
а потом просто используйте нормальный:w
:w !sudo tee %
. Это будет писать буфер вtee
, команде , которая принимает трубу информации и может записывать в файлы. И так как tee запускается с полномочиями sudo, tee может изменять файл.:w! ~/tempfile.ext
для записи изменений во временный файл, а затем примите меры для перемещения временного файла в каталог (отправьте временный файл владельцу каталога / администратору).Вы можете прочитать больше об этом здесь:
кратчайший путь
Поскольку это часто бывает проблема № 2 ( проблема с разрешением , с sudo ), вы можете использовать
/etc/vim/vimrc
(или~/.vimrc
) следующий ярлык:cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
Тогда вы можете просто напечатать,
:w!!
чтобы сохранить с полномочиями sudo . Я не буду объяснять это здесь, но ссылки выше покрывают много ярлыков.источник
Я могу придумать два способа сделать это.
Первый способ предполагает, что вы являетесь владельцем файла, но файл ЧИТАЕТСЯ.
Просто используйте суффикс восклицательного знака vi к команде записи (: w!), Чтобы принудительно перезаписать свой собственный файл READONLY. Это, конечно, предполагает, что у вас есть разрешение на запись и выполнение в текущей папке.
заставит vi перезаписать исходный файл READONLY.
Второй способ предполагает, что файл принадлежит кому-то другому, и вы хотели бы сохранить свои изменения в этом файле.
Один из способов сделать это - сохранить изменения, внесенные в исходный файл, в виде скрипта ed из vi. Этот сценарий ed может быть применен к исходному файлу (или другим аналогичным файлам) позднее, вне vi, с помощью редактора ed line.
Чтобы сохранить текущий сеанс редактирования в виде сценария ed, нужно передать исходное имя файла и отредактированный буфер vi в качестве стандартного ввода утилите diff с параметром командной строки --ed, т.е. отобразить различия в виде сценария ed.
Итак, предполагая, что отредактированный буфер vi, выполните следующее
Это заменяет все строки в текущем буфере (., $!) На созданный diff скрипт ed (diff --ed [original_file] -), необходимый для преобразования исходного файла в содержимое текущего буфера. Затем мы хотим сохранить этот сценарий ed в безопасном месте и применить сценарий к версии исходного файла, в который мы можем записать. Итак, сохраните сценарий в доступном для записи месте, например, в папке входа в систему:
Теперь выйдите из vi и используйте этот скрипт ed, чтобы получить отредактированный файл, который не удалось сохранить в первую очередь. Вот как это сделать из командной строки bash, '$':
То, что эта последовательность команд делает в словах, состоит в том, чтобы связать сгенерированный нами сценарий diff и повторить команду ed write 'w' на стандартный ввод ed. Затем Эд применяет этот сценарий к доступной для записи копии исходного файла и записывает эти измененные изменения буфера обратно в файл.
Таким образом, это способ сохранить работу, выполненную в vi, в файл, который изначально принадлежал кому-то другому, используя vi, diff и ed.
источник
Просто хочу охватить случай, когда нет прав на запись в файл.
Между ними vim будет жаловаться на изменения в файле (из-за смены флагов) - их можно игнорировать
источник
Другая возможность, в случае, если у вас нет привилегий sudo, - это использовать
:w /somewhere/where/i/have/permissions/foo.txt
, а затем решить проблему с разрешениями, как это делает Райан Фокс .источник