ubuntu - cron - ¿Qué es este editor que abre crontab?

CorePress2023-09-17  1

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.

  • 5 Lo más probable es que ed: de forma predeterminada, proporciona un recuento de caracteres (que en los sistemas basados ​​en Debian suele ser 888 la primera vez, siendo el número de caracteres en la plantilla crontab "vacía"). Si ve un recuento de 0, debe haberlo modificado. Ver el comando Crontab -e no funciona correctamente - conductor de acero 11 de septiembre de 2017 a las 12:41
  • 31 ¡Ed, hombre! !man ed: gnu.org/fun/jokes/ed-msg.html -juhista11 de septiembre de 2017 a las 13:42
  • 6 @juhist En lugar de un comentario, esta debería ser la respuesta. -postre 11 de septiembre de 2017 a las 15:13
  • 1 Si bien normalmente deseas anular EDITOR por otra cosa, si estás interesado en usar ed, esta es una excelente introducción: sanctum.geek.nz/arabesque/actually- usando-ed- Xiong Chiamiov 13 de septiembre de 2017 a las 18:36
  • @justme, por cierto, ¡bienvenido a StackExchange! Si encuentra una respuesta que mejor responda a su pregunta, puede aceptarla haciendo clic en la marca de verificación junto a ella. - JoL15 de septiembre de 2017 a las 17:35


------------Respuesta------------

Ese es ed

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.

EDITAR2: Configurar un editor diferente

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.

  • 2 Las versiones modernas reconocen los mensajes de error en inglés, solo necesita usar h para solicitarlos (o H para habilitarlos permanentemente). - usuario1686 Sep 13, 2017 a las 13:00
  • 2 (Además, % parece ser una invención ex. Oficialmente ed usa , para referirse a todas las líneas, aunque algunas versiones aceptan % también.) –usuario1686 13 de septiembre de 2017 a las 13:00
  • Esto es correcto pero también debe mencionar las variables de entorno EDITOR y VISUAL. - chrylis -cautelosamente optimista- 14 de septiembre de 2017 a las 0:35
  • La mayoría de los comandos en ed son los mismos que en vi, excepto que no es necesario presionar ":" primero en salir del modo de edición gráfica. Aprendí Unix cuando los "programadores reales" no perdió el tiempo usando GUI: una "pantalla verde" de 80x25 terminalFunciona casi tan bien como una perforadora de tarjetas IBM 029 para editar, pero no del todo ;) -alephzero 14 de septiembre de 2017 a las 7:03
  • @chrylis EDITAROR y VISUAL no son realmente tan relevantes. La pregunta era básicamente: ¿qué es este editor y cómo lo uso? (¿qué es este 0 y este ?, ¿y cómo lo guardo?). - JoL 14 de septiembre de 2017 a las 13:59


------------Respuesta------------

Cómo saber qué es este editor

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.

¿Qué es la educación?

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).

Cómo conseguir otro editor

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

  • Gilles, no debería en Ubuntu (y Debian y otros), el editor predeterminado del sistema es /etc/alternatives/editor reformulándose como En Ubuntu (y Debian y otros), el editor predeterminado del sistema es /usr/bin/editor? - heemayl 12 de septiembre de 2017 a las 8:38
  • bastante completo (excepto que no menciona la variable de entorno EDITOR, pero tal vez a propósito, para que las personas usen la forma adecuada de configurarla en el sistema a través de alternativas de actualización). Sin embargo, tal vez cambiar: ¿ps con pstree -sap $$? (es más fácil determinar qué editor se lanzó, ya que ahora está en formato de árbol) -Olivier Dulac 12 de septiembre de 2017 en 9:23
  • @heemayl /usr/bin/editor es un enlace simbólico al editor /etc/alternatives/. El hecho de que las aplicaciones llamen a /usr/bin/editor es un detalle que me salté.– Gilles 'ASÍ, deja de ser malvado' 12 de septiembre de 2017 a las 10:20
  • 3 @OlivierDulac Menciono EDITOR y VISUAL. De hecho, son la forma correcta de elegir un edito.r ya que se trata de una preferencia del usuario, no de todo el sistema. Prefiero limitarme a ps aquí para simplificar las cosas. – Gilles 'ASÍ, deja de ser malvado' 12 de septiembre de 2017 a las 10:21
  • 1"... computadoras cuyo periférico de salida interactivo era una impresora de línea." Una impresora de línea no era un dispositivo interactivo: era un dispositivo de velocidad relativamente alta (y costoso) para producir grandes cantidades de impresiones. Se refiere a "un terminal de impresión con teclado", como un teletipo (que también podría funcionar como un dispositivo de E/S de cinta de papel perforada) o una "pelota de golf" de IBM. máquina de escribir. -alephzero 14 de septiembre de 2017 a las 7:10


------------Respuesta------------

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:

  1. Si lo prefieres, puedes elegir un EDITOR diferente como editor predeterminado
  2. Si desea configurar el editor predeterminado en vim de forma permanente, deberá agregar el comando anterior a su archivo ~/.bashrc o ~/.profile o similar.



------------Respuesta------------

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.


  • ¡Un millón de gracias! Con el comando EDITOR="vi" crontab -e funciona. -solo yo 11 de septiembre de 2017 a las 14:21
  • 3 @gronostaj Esta no es la misma que cualquier otra respuesta que se haya publicado aquí. Configurar una variable de entorno para una única ejecución de un único comando no es lo mismo que exportarla para todos los comandos posteriores ejecutados desde la instancia de shell actual. Esa respuesta es útil fo cambiar la configuración de forma permanente, pero para controlar el editor por ejecución, esta es la respuesta correcta. - Eliah Kagan 11 de septiembre de 2017 a las 18:26
  • 3 De hecho, saber cómo anteponer variables de entorno en la línea de comando es muy importante, ya que cambiar la variable permanentemente podría no ser deseable. Una de las fortalezas sutiles de los shells *nix es la capacidad de hacerlo tan fácilmente. - Monty más duro 11 de septiembre de 2017 a las 22:05
Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare