Quiero editar crontab. Se supone que es Vi, pero no lo es, como puedes ver:
root@euve252628:~# crontab -e
0
0 * * * * /var/www/vhosts/nevemind-what-webs/httpdocs/megacronstunde.php
?
:wq
?
Sí, me dio un ?. ¿Y por qué me pone un cero?
Cuando escribo una q y presiono Enter, se cierra. Necesito saber cómo guardar, porque no es el Vi clásico.
Por defecto, su mensaje es la cadena vacía. Si desea salir, simplemente ingrese q. No antepongas :. Si tiene cambios no guardados, responderá con ?. Puedes interpretar eso como "¿estás seguro?" y confirmar ordenando q nuevamente. Por cierto, ¿cualquier comando que no entienda también hará que responda? Ese es el único mensaje de error que conoce.
Sus comandos son en los que se basa vim/vi/ex/sed, por lo que comandos como g/re/p, %s/vi/&m/g, 1,3d, /pattern/,$d, w , q, wq trabajo jÚselo como vim.
Los comandos como i, a y c entran en modo de inserción. Para salir del modo de inserción y volver al modo de comando, simplemente ingrese una línea que tenga solo un... Para "mover" a otra línea, simplemente ingrese el número de línea, un desplazamiento de la línea actual como +2 o -1, o un regex como comando para ir a esa línea. . significa línea actual en modo comando. Puedes usarlo para saber dónde estás. $ significa última línea.
Por cierto, si quieres aprender más sobre esto, siendo un programa GNU en Linux, la mayor parte de su documentación está en info ed en lugar de man ed.
Aquí hay una sesión de ejemplo, con comentarios agregados (no aceptados por el editor):
$ ed
i # insert (on current line)
vi
. # end insert
%s/vi/&m/g # substitute vi for vim globally in all lines
i # insert (on current line)
first line
. # end insert
$a # append on last line
last line
. # end insert
%p # print all lines
first line
vim
last line
2 # move to line 2 and print it
vim
/line # move forward to line matching /line/ and print it
last line
-1 # move 1 line backwards and print it
vim
?line # move backward to line matching /line/ and print it
first line
+1 # move 1 line forward and print it
vim
g/line/p # print lines matching /line/ (grep)
first line
last line
p # print (current line)
last line
. # move to current line and print it
last line
c # change (current line)
final line
. # end insert
%p # print all lines
first line
vim
final line
/vim/,$c # change from line matching /vim/ to last line
that's all
. # end insert
%p # print all lines
first line
that's all
wq # write and quit
? # write what?
h # help with last error message
No current filename
wq # write and quit to check error message
?
H # help with all error messages
No current filename
wq # write and quit to check error message
?
No current filename
wq file.txt # write file.txt and quit
22 # wrote 22 bytes
EDITAR: Como menciona grawity, se pueden activar mensajes de error más útiles con h o H. Además, en lugar de % en la parte de rango de un comando es la parte oficialforma de referirse a "todas las líneas" en ed. En GNU ed, la posibilidad de usar % para esto es compatible pero no se menciona en el manual de información. El uso de % para todas las líneas aparentemente fue inventado por ex, aparentemente porque allí, significa.... en lugar de 1,$ como en ed.
Al igual que otras respuestas mencionadas, si desea especificar un editor diferente, puede hacerlo configurando las variables de entorno EDITOR o VISUAL. La diferencia entre los dos se explica en esta respuesta.
Puedes hacerlo así si quieres configurarlo para un solo comando:
EDITOR=vi crontab -e
o así si desea que todos los programas iniciados en la sesión de shell lo utilicen:
export EDITOR=vi
crontab -e
Puedes guardar la exportación en ~/.profile o /etc/profile, dependiendo de si quieres que sea un conjunto de usuario o sistema.ting para bash, respectivamente. Esa es la forma portátil de Unix de configurar el editor; puedes hacer esto en cualquier distribución.
En Ubuntu, también existe el comando update-alternatives. El editor predeterminado actual se puede ver con update-alternatives --display editor, y puedes usar update-alternatives --config editor para configurarlo:
$ sudo update-alternatives --config editor
There are 4 choices for the alternative editor (providing /usr/bin/editor).
Selection Path Priority Status
------------------------------------------------------------
* 0 /bin/nano 40 auto mode
1 /bin/ed -100 manual mode
2 /bin/nano 40 manual mode
3 /usr/bin/vim.basic 30 manual mode
4 /usr/bin/vim.tiny 10 manual mode
Press enter to keep the current choice[*], or type selection number: 3
update-alternatives: using /usr/bin/vim.basic to provide /usr/bin/editor (editor) in manual mode.
Presione Ctrl+Z. Esto suspende el editor y le muestra un indicador de shell. Cuando se le solicite, ejecute ps para ver qué procesos se están ejecutando en esta terminal.
bash-4.3$ crontab -e
1077
^Z
[1]+ Stopped crontab -e
bash-4.3$ ps
PID TTY TIME CMD
26295 pts/10 00:00:00 bash
26297 pts/10 00:00:00 crontab
26298 pts/10 00:00:00 sh
26299 pts/10 00:00:00 ed
26302 pts/10 00:00:00 ps
bash es el shell original, crontab esComo se esperaba, sh es otro shell que debe haber sido invocado por crontab y ps es el comando ps en ejecución. Eso deja ed (proporcionado por el paquete del mismo nombre).
Si no sabes cómo salir del editor, puedes cerrarlo en este punto, con kill 26302 o kill %1.
Ed es un editor antiguo, que se remonta a antes de que los monitores fueran algo (común). Fue diseñado para computadoras cuyo periférico de salida interactivo era una teleimpresora.
El 0 que muestra al principio es el número de líneas del archivo. Evidentemente se trata de información importante.
? Significa que Ed no entendió lo que escribiste. Las impresoras de líneas son lentas, por lo que ed no pierde tiempo ni tinta para mostrar información inútil, como mensajes de error. Un viejo chiste (no sé elorigen) dice:
Ken Thompson tiene un automóvil que ayudó a diseñar. A diferencia de la mayoría de los automóviles, no tiene velocímetro, ni indicador de gasolina, ni ninguna de las numerosas luces idiotas que atormentan al conductor moderno. Más bien, si el conductor comete un error, aparecerá un “?” Se enciende en el centro del tablero. "El conductor experimentado", afirma Thompson, "normalmente sabrá lo que está mal".
Si no tiene experiencia, puede ejecutar el comando H (todos los comandos menos uno son de una sola letra (sin contar los argumentos de datos), porque a quién le gusta escribir) y recibirá mensajes de error. Por ejemplo, si simplemente presiona Enter…
?
H
Invalid address
Claro, ¿no? (Una línea vacía es el comando vacío, el que no tiene una sola letra. El comando vacío pasa a la siguiente línea y la imprime. Si eres unAl final del archivo, lo que siempre ocurre en un archivo vacío, no hay una línea siguiente, por lo que la dirección a la que solicitó moverse no es válida).
El comando crontab, como la mayoría de los comandos que ejecutan un editor de texto, verifica las variables de entorno VISUAL y EDITOR (en ese orden) para decidir qué programa ejecutar, recurriendo a un valor predeterminado del sistema. Si alguna de estas variables está configurada en ed, cámbiela o elimínela.
En Ubuntu (y Debian y otros), el editor predeterminado del sistema es /etc/alternatives/editor, que se administra a través del mecanismo de alternativas. De forma predeterminada, elige el "mejor" editor instalado, donde "mejor" se define por las prioridades establecidas por los mantenedores del paquete. Utilice alternativas de actualización para configurar una alternativa. Puedes mostrar eleditores disponibles y sus prioridades con
update-alternatives --display editor
ed tiene la prioridad -100, mientras que todos los demás editores "sensibles" tienen una prioridad positiva, por lo que la única forma de usarlo de forma predeterminada es si no se ha instalado ningún editor. Una instalación predeterminada de Ubuntu usa nano como editor predeterminado, con prioridad 400. Si la alternativa se ha configurado en ed, puedes cambiarla con
sudo update-alternatives --config editor
Según tu pregunta, parece que tu EDITOR predeterminado no es vim y tienes problemas con el editor predeterminado actual.
El siguiente comando configurará el EDITOR predeterminado como vim
export EDITOR=vim
Después de configurar el editor predeterminado como vim, ejecutar crontab -e usará vim como su editor.
Notas:
Para usar el editor VI para editar crontab, use el siguiente comando.
EDITOR="vi" crontab -e
o, si desea editar con otro editor como gedit, nano, etc., simplemente reemplace vi con el nombre del editor.