47

Я использую vim для редактирования файла. Иногда я забываю иметь соответствующие разрешения. Я запускаю vim и файл как файл только для чтения. Я могу внести изменения, но на самом деле я не могу написать изменения. Время от времени я заканчиваю тем, что открывал файл и вносил в него изменения, осознавая, что я не запускал его в sudo, кричал сам себе, а затем принудительно завершал работу и снова открывал его как пользователь root.

Есть ли обходной путь для этого? Могу ли я принудительно внести изменения в файл, несмотря на статус файла только для чтения? Могу ли я хотя бы сохранить изменения, запустить diff и объединить файлы?

4 ответа4

71

Кажется, есть несколько разных подходов, в зависимости от вашей текущей проблемы:

  1. Только чтение по vi. Если ваш файл имеет :set readonly вы можете
    • Использование :w! заставить писать, или
    • Проблема :set noreadonly а затем просто используйте обычный :w
  2. Проблема разрешения (sudo): вы не можете писать, но у вас есть права sudo.
    • Выпуск :w !sudo tee % . Это запишет буфер tee команда , которая получает информацию трубы и может записывать файлы. А так как tee запускается с полномочиями sudo, tee может изменять файл.
  3. Проблема с разрешениями (без sudo): у вас нет прав на запись файла и у вас нет прав администратора.
    • Использование :w! ~/tempfile.ext чтобы записать ваши изменения во временный файл, а затем принять меры для перемещения временного файла в каталог (отправьте временный файл владельцу каталога /admin).

Вы можете прочитать больше об этом здесь:

  1. Из StackOverflow
  2. От Geekyboy
  3. Из данных Agaric

кратчайший путь

Поскольку проблема № 2 часто возникает (проблема с правами доступа с помощью sudo), вы можете использовать в вашем /etc/vim/vimrc (или ~/.vimrc) следующий ярлык:

  • cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!

Тогда вы можете просто набрать :w!! чтобы сохранить силы sudo . Я не буду объяснять это здесь, но ссылки выше покрывают много ярлыков.

4

Я могу придумать два способа сделать это.

Первый способ предполагает, что вы являетесь владельцем файла, но файл ЧИТАЕТСЯ.

Просто используйте суффикс восклицательного знака vi в команде записи (:w!) заставить перезаписать свой собственный файл READONLY. Это, конечно, предполагает, что у вас есть разрешение на запись и выполнение в текущей папке.

:w!

заставит vi перезаписать исходный файл READONLY.

Второй способ предполагает, что файл принадлежит кому-то другому, и вы хотели бы сохранить свои изменения в этом файле.

Один из способов сделать это - сохранить изменения, внесенные в исходный файл, в виде скрипта ed из vi. Этот сценарий ed может быть применен к исходному файлу (или другим аналогичным файлам) позднее, вне vi, с помощью редактора ed line.

Чтобы сохранить текущий сеанс редактирования в виде сценария ed, нужно передать исходное имя файла и отредактированный буфер vi в качестве стандартного ввода утилите diff с параметром командной строки --ed, т.е. отобразить различия в виде сценария ed.

Итак, предполагая отредактированный буфер vi, выполните следующее

:.,$!diff --ed [original_file] -

Это заменит все строки в текущем буфере (., $!) с помощью сценария diff, сгенерированного diff (diff --ed [original_file] -), необходимого для преобразования исходного файла в содержимое текущего буфера. Затем мы хотим сохранить этот сценарий ed в безопасном месте и применить сценарий к версии исходного файла, в который мы можем записать. Итак, сохраните сценарий в доступном для записи месте, например, в папке входа в систему:

:w ~/my_ed_script

Теперь выйдите из vi и используйте этот скрипт ed, чтобы получить отредактированный файл, который не удалось сохранить в первую очередь. Вот как это сделать из командной строки bash, '$':

$ (cat ~/my_ed_script && echo 'w') | ed - writable_copy_of_original_file

То, что эта последовательность команд делает в словах, состоит в том, чтобы соединить сгенерированный нами скрипт с помощью diff и повторить команду ed write 'w' на стандартный ввод ed. Затем Эд применяет этот сценарий к доступной для записи копии исходного файла и записывает эти измененные изменения буфера обратно в файл.

Таким образом, это способ сохранить работу, выполненную в vi, в файл, который изначально принадлежал кому-то другому, используя vi, diff и ed.

0

Другая возможность, в случае, если у вас нет привилегий sudo, - это использовать :w /somewhere/where/i/have/permissions/foo.txt , а затем решить проблему с разрешениями, согласно Райану Фоксу.

0

Просто хочу охватить случай, когда нет прав на запись в файл.

:!chmod +w %
:w!

Между ними vim будет жаловаться на изменения в файле (из-за смены флагов) - их можно игнорировать

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .