Uso del tacto y vi?

55

¿Existe la ventaja de crear un archivo con toque antes de editarlo?

touch foo
vi foo

versus llevarlo al editor de inmediato? Me gusta:

vi foo

Veo bastantes tutoriales usando el primero ( touchentonces vi).

Fawix
fuente

Respuestas:

111

touchAl iniciar el archivo, primero confirma que realmente tiene la capacidad de crear el archivo, en lugar de perder el tiempo en un editor solo para descubrir que el sistema de archivos es de solo lectura o algún otro problema.

DopeGhoti
fuente
66
Y le touchpermite hacer chmod +xdespués, antes de editar, lo que tendría sentido si está escribiendo un #!/bin/bashscript de shell.
Aaron McDaid
11
Sin embargo , también puedes hacer lo :wprimero después de comenzar vi. (y :chmod +x %si quieres que sea ejecutable)
Stéphane Chazelas
26
touchpuede fallar en vi's :w!habrían tenido éxito, aunque (por ejemplo, si fileexiste pero no eres su propietario y no tiene acceso de escritura a la misma, mientras que tiene acceso de escritura en el directorio actual). Por el contrario, touchpuede tener éxito, pero vi's :wo :w!puede fallar si usted es propietario del archivo, pero no tienen acceso de escritura a él ni al directorio actual (que sería capaz de trabajar alrededor de ella con :!chmod +w %(algunas viimplementaciones como vimpuede hacerlo que automáticamente sobre :w!)).
Stéphane Chazelas
tiene mucho sentido ahora!
Fawix
44
Vim / vi muy claramente estado si abrir un archivo que no tiene permiso para escribir a: "foo" [readonly]. Y nuevamente al ingresar al modo de inserción:Warning: Changing a readonly file.
DevSolar
25

Además de las respuestas dadas, una ventaja del tacto es que cualquier otro usuario / terminal que edite el mismo archivo mientras lo toca, recibirá una advertencia cuando intente guardar cualquier cambio.

WARNING: The file has been changed since reading it!!!
Do you really want to write to it (y/n)?

Esto los alertaría aunque no haya realizado ningún cambio per se y solo haya tocado el archivo.

amisax
fuente
buen punto, por lo que es esencialmente una buena manera de descubrir si las personas están usando / editando el mismo archivo y advertirles al mismo tiempo. ¡Veo un claro beneficio de eso en un entorno multiinquilino!
Fawix
@Fawix, entonces deberías actualizar esta respuesta Aswell
Kiwy
19

Aparte de la respuesta aceptada:

Vale la pena señalar que touchse utiliza para actualizar las marcas de tiempo del archivo. Si usa touchun archivo que existe, actualizará la marca de tiempo de los archivos a la fecha y hora actuales. Si el archivo no existe, crea un archivo vacío con la fecha y hora actuales como la marca de tiempo.

vi, por otro lado, no crea un nuevo archivo a menos que lo escriba.

Por ejemplo, si escribí vi test.txt, escribí algunas notas, luego escribí :q!; test.txtNo existiría.

Peschke
fuente
¿Qué pasa con el beneficio descrito en la respuesta aceptada?
JBentley
8

Sin touch, un nuevo archivo no existirá hasta que le diga vique lo escriba.

Considere un sistema multiusuario (quizás esté en un sistema de archivos montado en red compartido por muchos sistemas, cada uno con muchos usuarios). La ejecución touchgarantizará que tenga el archivo (y que pueda escribir en él) e incluso actualizará la marca de tiempo. Otro usuario que desee crear dicho archivo verá que usted es el propietario. Si ya existe y otro usuario desea eliminarlo o reemplazarlo, verán que se modificó recientemente y tal vez lo piensen dos veces.

Adam Katz
fuente
4

No hay beneficio para touching primero; vicreará el archivo si no existe.

La respuesta aceptada dice que comprueba si puedes escribir allí antes de perder el tiempo en un editor. Es cierto, pero ahora perderás el tiempo escribiendo touchtodo el tiempo. No poder escribir en algún lugar es bastante excepcional en comparación con la frecuencia con la que simplemente funcionará (siempre que recuerde los sudoarchivos fuera de su directorio de inicio o /tmp, o estén conectados como root).

Simplemente abra el editor y haga lo que quiera, luego intente guardar el archivo. Si no funciona, incluso con :w!, guárdelo en otro lugar ( :w ~/asdf) y solucione el problema. Una vez que se ha solucionado, puede copiar el contenido del archivo del archivo temporal a la original: cat ~/asdf > /mnt/example.txt && rm ~/asdf. La razón que usamos en catlugar de mvo cpes para usar los permisos del destino y otros atributos.

Además, para un uso más avanzado de la línea de comandos, puede usar el fondo vicon Ctrl+ Zmientras soluciona el problema (o usar :suspend, o :sus), y finalmente fgvolver a ejecutar el comando de escritura.

Editar: publicación mejorada en respuesta a / u / comentarios de G-Man . ¡Gracias!

Luc
fuente
3
Aquí hay algunos problemas de seguridad: (1) Si /mnt/example.txtse supone que el archivo no es legible en todo el mundo, pero su umask está configurado en algo permisivo como 22, entonces /tmp/asdf será legible en todo el mundo. Si hay otras personas en el sistema, pueden leer la copia temporal del archivo. (2) /mnt/example.txtEs probable que el archivo no se pueda escribir en todo el mundo, pero, si hay personas maliciosas en el sistema, pueden leer la copia temporal del archivo y reemplazarlo con una versión modificada antes de mover / copiar Volver a la ubicación correcta.   … (Continúa)
G-Man dice 'Reincorporar a Monica' el
3
(Cont.) ... (Configurar el bit adhesivo /tmppuede evitar esto). (3) El comando mv /tmp/asdf /mnt/example.txtdestruirá totalmente la corriente /mnt/example.txty la reemplazará por /tmp/asdf. Desea reemplazar el contenido de /mnt/example.txtcon el contenido de /tmp/asdf. Al usarlo mv, usted configura /mnt/example.txtlos mismos atributos que /tmp/asdf, probablemente de su propiedad y legibles en todo el mundo. Podría ser mejor cp /tmp/asdf /mnt/example.txto incluso cat /tmp/asdf > /mnt/example.txt. … PS (4) Puede suspender viescribiendo :suspend(o :sus, para abreviar).
G-Man dice 'reinstalar a Monica' el
@ G-Man Esos son algunos buenos puntos. No tengo miedo de que alguien robe un archivo durante los 5 minutos que está dentro /tmp, pero no hay excusa para no escribir en su ~/lugar. Tampoco había pensado en que reemplazaría los atributos. Editaré mi publicación, gracias :)
Luc
3

No hay beneficio vicreará un archivo si no existe.

ronakg
fuente
1

vi es un editor de texto visual (vi = visual) De todos modos, es visual en comparación con "ed", lo que simplemente le permite ver y cambiar una línea de texto a la vez.

El touchcomando actualiza la marca de tiempo en un archivo existente o crea un nuevo archivo si el archivo aún no existía. Es bueno para probar cosas que dependen mucho de las marcas de tiempo.

Ahora, si su archivo es un archivo de texto, o aún no existe, abrirlo con vi y luego emitir el comando :wqvi, tendría el mismo resultado que tocar ese archivo. Esa es la única forma en que los dos comandos son similares.

malyy
fuente
1

Específicamente para usar con vi, no hay necesidad de crear el archivo antes de editarlo: vise puede usar para crear y guardar un nuevo archivo. Sin embargo, hay contextos de llamada donde el archivo debe existir. Por ejemplo, en mi sistema (OS X) puedo iniciar un editor GUI apropiado (determinado por tipo de archivo) como este:

open foo.txt

Esto se abriría foo.txten TextEdit, o en emacs, o lo que sea que haya especificado como mi editor de elección para archivos de texto, y desconectaría el proceso para que recibiera mi mensaje de inmediato. ( open bar.pypodría abrirlo en IDLE, el editor de Python; etc.) O puedo solicitar explícitamente emacs:

open -a emacs foo.txt

Pero openrequiere que el archivo ya exista, de lo contrario genera un error. Así que tuve que definir emacsla siguiente función de shell, lo que me permite escribir emacs foopara iniciar la emacsGUI incluso si foono existe.

function emacs () 
{ 
    if [ -n "$1" -a ! -e "$1" ]; then
        /usr/bin/touch "$1";
    fi;
    open -a emacs "$@"
}
alexis
fuente
0

vi se usa para editar un archivo como usuario, mientras que el toque puede establecer la marca de tiempo en él y se usa principalmente en scripts y demás.

Otra forma de crear un archivo es:

>newfile.txt
lamer
fuente
1
Esto no es confiable porque no está (afaik) especificado en la especificación POSIX. Por ejemplo, In zsh, es idéntico cat >newfile.txty necesita presionar Ctrl + D.
Adam Katz
@AdamKatz buen punto; Actualicé la respuesta, gracias por el consejo.
James Youngman
0

Por página de contacto, su trabajo principal es cambiar las marcas de tiempo del archivo.
Ofc también está creando el archivo con la marca de tiempo actual y luego puede editar el archivo.

VI es un editor de texto que hace lo que dice editar texto abierto, guardar, editar archivo, etc.

Todo es sabor del usuario y del habbit: toque luego vi o vi file.txt mismo color diferente.

igiannak
fuente
0

touch El comando cambia la fecha y la hora de un archivo con la marca de tiempo actual.
Si el archivo no existe, crea un nuevo archivo con fecha y hora.

vi editor se usa para editar archivos si el archivo no existe, crea un archivo nuevo a menos que no lo guardemos.

Premraj
fuente