¿Qué es este editor que abre crontab?

41

Quiero editar crontab. Se supone que es Vi, pero no lo es, como puede 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 da un cero?

Cuando escribo a qy presiono Enter, se cierra. Necesito saber cómo ahorrar, porque no es Vi clásico.

solo yo
fuente
55
Lo más probable ed: de forma predeterminada, proporciona un recuento de caracteres (que en los sistemas basados ​​en Debian suele ser 888la primera vez, es el número de caracteres en la plantilla crontab "vacía"). Si está viendo un recuento de 0, debe haber modificado eso. Ver comando crontab -e no funciona correctamente
steeldriver
31
ed, hombre! ! man ed: gnu.org/fun/jokes/ed-msg.html
juhist
66
@juhist En lugar de un comentario, esta debería ser la respuesta.
postre
1
Si bien generalmente desea anular EDITORalgo más, si está interesado en usar ed, esta es una gran introducción: sanctum.geek.nz/arabesque/actually-using-ed
Xiong Chiamiov
@justme, por cierto, ¡bienvenido a StackExchange! Si encuentra una respuesta que responda mejor a su pregunta, puede aceptarla haciendo clic en la marca de verificación junto a ella.
JoL

Respuestas:

65

Eso es ed

Por defecto, su mensaje es la cadena vacía. Si desea dejar de fumar, simplemente ingrese q. No prefijas con :. Si tiene cambios sin guardar, responderá con ?. Puede interpretar eso como "¿está seguro?" Y confirmar al ordenar qnuevamente. Por cierto, cualquier comando que no entienda también hará que responda ?. Ese es el único mensaje de error que conoce.

Sus comandos son lo que vim / vi / ex / SED se basa en, por lo que los comandos como g/re/p, %s/vi/&m/g, 1,3d, /pattern/,$d, w, q, wqfuncionan igual que vim.

Los comandos como i, ay centran en modo de inserción. Para abandonar el modo de inserción y volver al modo de comando, introduzca una línea que tiene sólo una .. Para "moverse" a otra línea, simplemente ingrese el número de línea, un desplazamiento de la línea actual como +2o -1, o una expresión regular como un 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 desea obtener más información al respecto, al tratarse de un programa GNU en Linux, la mayor parte de su documentación se encuentra en info edlugar de man ed.

Aquí hay una sesión de ejemplo, con comentarios agregados (no aceptados por ed):

$ 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 ho H. Además, en ,lugar de %en el rango, la parte de un comando es la forma oficial 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 infomanual. El uso de %para todas las líneas aparentemente fue inventado por ex, aparentemente porque, allí, ,significa .,.más que 1,$como en ed.

EDIT2: configuración de un editor diferente

Al igual que otras respuestas mencionan, si desea especificar un editor diferente, puede hacerlo mediante el establecimiento de las EDITORo VISUALvariables de entorno. La diferencia entre los dos se explica en esta respuesta .

Puede hacerlo así si desea configurarlo para un solo comando:

EDITOR=vi crontab -e

o de esta manera si desea que todos los programas iniciados en la sesión de shell lo usen:

export EDITOR=vi
crontab -e

Puede guardar el exporten ~/.profileo /etc/profile, dependiendo de si usted quiere que sea un ajuste de usuario o sistema 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 update-alternativescomando. El editor predeterminado actual se puede ver con update-alternatives --display editor, y puede usar update-alternatives --config editorpara 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.
JoL
fuente
2
Las versiones modernas conocen mensajes de error en inglés, solo debe usarlos hpara solicitarlos (o Hpara habilitarlos permanentemente).
Grawity
2
(También, %parece ser un ex invención Oficialmente. Ed usos ,para significar todas las líneas, aunque algunas versiones aceptan %también.)
grawity
Esto es correcto , pero también debe mencionar las EDITORy VISUALvariables de entorno.
chrylis -on strike-
La mayoría de los comandos en edson los mismos que en vi, excepto que no tiene que presionar ":" primero para salir del modo de edición gráfica. Aprendí Unix cuando los "programadores reales" no perdieron el tiempo usando interfaces gráficas de usuario: un terminal de "pantalla verde" de 80x25 funciona casi tan bien como un punzón de tarjeta IBM 029 para la edición, pero no del todo;)
alephzero
@chrylis EDITORy VISUALrealmente no son tan relevantes. La pregunta era básicamente: ¿qué es este editor y cómo lo uso? (¿Qué es esto 0y esto ?, y cómo ahorro?).
JoL
39

Cómo averiguar qué es este editor

Presione Ctrl+ Z. Esto suspende el editor y le da un indicador de shell. En el indicador, ejecute pspara ver qué procesos se están ejecutando en este 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

bashes el shell original, crontabse espera, shes otro shell que debe haber sido invocado por crontab, y pses el pscomando en ejecución . Eso se va ed(proporcionado por el paquete del mismo nombre ).

Si no puede encontrar la manera de salir del editor, puede eliminarlo en este momento, con kill 26302o kill %1.

¿Qué es ed?

Ed es un editor antiguo, que data de antes de que los monitores fueran algo (común). Fue diseñado para computadoras cuyo periférico de salida interactivo era una teleimpresora .

El que 0se muestra al principio es el número de líneas en el archivo. Evidentemente, esa es información importante.

?significa que ed no entendió lo que escribiste. Las impresoras lineales 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é el origen) 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 medidor de gas, ni ninguna de las otras numerosas luces idiotas que afectan al conductor moderno. Por el contrario, si el conductor comete un error, se enciende un "?" Gigante en el centro del tablero. "El conductor experimentado", dice Thompson, "generalmente sabrá lo que está mal".

Si no tiene experiencia, puede emitir el comando H(todos los comandos menos uno son una sola letra (sin contar los argumentos de datos), porque a quién le gusta escribir), y recibirá mensajes de error. Por ejemplo, si solo presiona Enter...

?
H
Invalid address

Claro, ¿no es así? (Una línea vacía es el comando vacío, el que no es una sola letra. El comando vacío se mueve a la siguiente línea y la imprime. Si está al final del archivo, que siempre es el caso en un vacío archivo, 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 crontabcomando, como la mayoría de los comandos que ejecutan un editor de texto, verifica las variables de entorno VISUALy EDITOR(en ese orden) decide qué programa ejecutar, volviendo a los valores predeterminados del sistema. Si alguna de estas variables está establecida 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 . Por defecto, elige el "mejor" editor que está instalado, donde "mejor" se define por las prioridades establecidas por los encargados del mantenimiento del paquete. Use update-alternativespara configurar una alternativa. Puede mostrar los editores disponibles y sus prioridades con

update-alternatives --display editor

edtiene la prioridad -100, mientras que todos los demás editores "sensibles" tienen una prioridad positiva, por lo que la única forma en que se usaría por defecto 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, puede cambiarlo con

sudo update-alternatives --config editor
Gilles 'SO- deja de ser malvado'
fuente
Gilles, no debería en Ubuntu (y Debian y otros), el editor predeterminado del sistema es / etc / Alternatives / editor se reformulará en On Ubuntu (y Debian y otros), el editor predeterminado del sistema es / usr / bin / editor ?
heemayl
bastante completo (excepto que no menciona la variable EDITOR env? pero tal vez a propósito, para que las personas usen la forma correcta de configurarlo en el sistema a través de alternativas de actualización). Tal vez cambiar sin embargo: pscon pstree -sap $$ ? (es más fácil saber qué editor se lanzó, ya que ahora está en formato de árbol)
Olivier Dulac
@heemayl /usr/bin/editores un enlace simbólico a /etc/alternatives/editor. El hecho de que las aplicaciones llamen /usr/bin/editores un detalle que omití.
Gilles 'SO- deja de ser malvado'
3
@OlivierDulac menciono EDITORy VISUAL. De hecho, son la forma correcta de elegir un editor ya que esta es una preferencia del usuario, no una preferencia de todo el sistema. Prefiero quedarme psaquí para mantener las cosas simples.
Gilles 'SO- deja de ser malvado'
1
"... computadoras cuyo periférico de salida interactivo era una impresora de línea". Una impresora de líneas no era un dispositivo interactivo: era un dispositivo de velocidad relativamente alta (y costoso) para producir grandes cantidades de salida impresa. Se refiere a "un terminal de impresión con un teclado", como un teletipo (que también podría funcionar como un dispositivo de E / S de cinta de papel perforado) o una máquina de escribir "pelota de golf" de IBM.
alephzero
12

Según su pregunta, parece que su EDITOR predeterminado no lo es vim, y tiene problemas con el editor predeterminado actual.

El siguiente comando establecerá el EDITOR predeterminado como vim

export EDITOR=vim

Después de configurar el editor predeterminado para que se vimejecute, crontab -ese usará vimcomo editor.

Notas:

  1. Si lo prefiere, puede elegir EDITOR diferente como su editor predeterminado
  2. Si desea configurar el editor por defecto de vimforma permanente, que tendrá que añadir el comando anterior a su ~/.bashrco ~/.profileo similares archivo.
Yaron
fuente
4

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.

harsha
fuente
Gracias un millón! Con el EDITOR = "vi" crontab -e funciona.
justme
3
@gronostaj Esto no es lo mismo que cualquier otra respuesta que se haya publicado aquí. Establecer una variable de entorno para una sola ejecución de un solo comando no es lo mismo que exportarlo para todos los comandos posteriores ejecutados desde la instancia de shell actual. Esa respuesta es útil para cambiar la configuración de forma permanente, pero para controlar el editor por ejecución, esta es la respuesta correcta.
Eliah Kagan
3
De hecho, saber cómo anteponer las variables de entorno en la línea de comando es muy importante, ya que cambiar la variable de forma permanente puede ser indeseable. Una de las fortalezas sutiles de los proyectiles * nix es la capacidad de hacer esto tan fácilmente.
Monty Harder