Yo uso vim para editar un archivo. A veces, me olvido de tener los permisos adecuados. Ejecuto vim y el archivo como un archivo de solo lectura. Puedo hacer cambios, pero en realidad no puedo escribir los cambios. De vez en cuando, termino abriendo un archivo y haciéndole cambios, me doy cuenta de que no lo ejecuté en sudo, me grito a mí mismo, y luego fuerzo a salir y lo vuelvo a abrir como usuario root.
¿Hay una solución para esto? ¿Puedo forzar los cambios en el archivo a pesar del estado de solo lectura del archivo? ¿Puedo al menos guardar los cambios, ejecutar un diff y fusionar los archivos?
linux
vim
terminal
permissions
andor kesselman
fuente
fuente
Respuestas:
Parece haber algunos enfoques diferentes, dependiendo de su problema actual:
:set readonly
puedes:w!
para forzar la escritura, o:set noreadonly
y luego usar normal:w
:w !sudo tee %
. Esto escribirá el búfer entee
, un comando que recibe información de tubería y puede escribir en archivos. Y como tee se ejecuta con sudo powers, tee puede modificar el archivo.:w! ~/tempfile.ext
para escribir sus cambios en un archivo temporal y luego tome medidas para mover el archivo temporal al directorio (envíe el archivo temporal al propietario / administrador del directorio).Puedes leer más sobre esto aquí:
Atajo
Como suele ser el problema número 2 ( problema de permiso , con sudo ), puede acceder a su
/etc/vim/vimrc
(o~/.vimrc
) acceso directo siguiente:cnoremap w!! execute 'silent! write !sudo tee % >/dev/null' <bar> edit!
Luego, simplemente puede escribir
:w!!
para guardar con poderes sudo . No lo explicaré aquí, pero las referencias anteriores cubren muchos accesos directos.fuente
Puedo pensar en dos formas de hacer esto.
La primera forma supone que es el propietario del archivo, pero el archivo es READONLY.
Simplemente use el sufijo de signo de exclamación de vi en el comando de escritura (: w!) Para forzar la sobrescritura de su propio archivo READONLY. Por supuesto, esto supone que tiene permiso para escribir y ejecutar en la carpeta actual.
hará que vi sobrescriba el archivo READONLY original.
La segunda forma supone que otra persona es propietaria del archivo y desea guardar los cambios en ese archivo.
Una forma de lograr esto es guardar los cambios realizados en el archivo original como un script ed desde vi. Este script ed puede aplicarse al archivo original (u otros archivos similares) en un momento posterior fuera de vi con el editor de línea ed.
Una forma de guardar la sesión de edición actual como un script ed es pasar el nombre del archivo original y el buffer vi editado como entrada estándar a la utilidad diff con el interruptor de línea de comando --ed, es decir, mostrar las diferencias como un script ed.
Entonces, suponiendo un búfer vi editado, luego realice lo siguiente
Esto reemplaza todas las líneas en el búfer actual (., $!) Con el script ed generado por diff (diff --ed [original_file] -) necesario para convertir el archivo original en el contenido del búfer actual. Luego queremos guardar este script ed en un lugar seguro y aplicar el script a una versión del archivo original en el que podamos escribir. Por lo tanto, guarde el script en una ubicación de escritura, por ejemplo, su carpeta de inicio de sesión:
Ahora salga de vi y use este script ed para obtener el archivo editado que no se pudo guardar en primer lugar. Aquí se explica cómo lograrlo desde la línea de comandos de bash, '$':
Lo que esta secuencia de comandos hace en palabras es catear el script que generamos con diff y hace eco del comando ed write, 'w', en la entrada estándar de ed. Luego, Ed aplica este script a la copia editable del archivo original y escribe los cambios de búfer modificados nuevamente en el archivo.
Entonces, esa es una manera de guardar el trabajo realizado en vi en un archivo que originalmente había sido propiedad de otra persona que usa vi, diff y ed.
fuente
Solo quiero cubrir el caso cuando no hay permisos de escritura de archivos.
En el medio, vim se quejará de los cambios en el archivo (debido al cambio de banderas), obviamente es seguro ignorarlos
fuente
Otra posibilidad, para el caso en el que no tiene privilegios de sudo, es usar
:w /somewhere/where/i/have/permissions/foo.txt
, y luego tratar el problema de los permisos más tarde, según Ryan Fox .fuente