Quel est cet éditeur qui est ouvert par crontab?

41

Je veux éditer crontab. C'est supposé être Vi, mais ce n'est pas, comme vous pouvez le voir:

root@euve252628:~# crontab -e

0

0 * * * * /var/www/vhosts/nevemind-what-webs/httpdocs/megacronstunde.php

?

:wq

?

Oui, ça m'a donné un ?. Et pourquoi ça me donne un zéro?

Quand je tape a qet appuyez sur Enter- il se ferme. J'ai besoin de savoir comment économiser, car ce n'est pas du classique Vi.

juste moi
la source
5
Très probablement ed: par défaut, il donne un nombre de caractères (ce qui dans les systèmes basés sur Debian est généralement 888la première fois, c'est-à-dire le nombre de caractères du modèle "vide" de la crontab). Si vous voyez un nombre de 0, vous devez avoir modifié cela. Voir la commande Crontab -e ne fonctionnant pas correctement
steeldriver
31
ed, mec! ! man ed: gnu.org/fun/jokes/ed-msg.html
juhist le
6
@juhist Plutôt qu'un commentaire, cela devrait être la réponse.
Dessert
1
Alors que vous voulez généralement passer EDITORà autre chose, si vous êtes intéressé par l'utilisation de ed, ceci est une excellente introduction: sanctum.geek.nz/arabesque/actually-using-using
Xiong Chiamiov 13/09/2017 à 18h17
@justme, au fait, bienvenue sur StackExchange! Si vous trouvez une réponse qui correspond le mieux à votre question, vous pouvez l'accepter en cliquant sur la coche à côté.
JoL

Réponses:

65

C'est ed

Par défaut, son invite est la chaîne vide. Si vous voulez quitter, entrez simplement q. Ne préfixez pas avec :. Si vous avez des modifications non enregistrées, il vous répondra avec ?. Vous pouvez interpréter cela comme "êtes-vous sûr?", Et confirmez en commandant à qnouveau. En passant, toute commande qu’elle ne comprend pas entraînera également une réponse ?. C'est le seul message d'erreur qu'il connaisse.

Ses commandes sont ce que vim / vi / ex / sed est basé sur, si commandes telles que g/re/p, %s/vi/&m/g, 1,3d, /pattern/,$d, w, q, wqtravail comme vim.

Les commandes comme i, aet cpassent en mode insertion. Pour quitter le mode insertion et revenir au mode commande, entrez simplement une ligne qui ne contient qu'un .. Pour "passer" à une autre ligne, entrez simplement le numéro de la ligne, un décalage par rapport à la ligne actuelle +2ou -1, ou une expression rationnelle en tant que commande pour accéder à cette ligne. .signifie la ligne en cours en mode commande. Vous pouvez l'utiliser pour savoir où vous en êtes. $signifie dernière ligne.

Soit dit en passant, si vous voulez en savoir plus sur ce programme, il s’agit d’un programme GNU sous Linux, la plupart de sa documentation est au info edlieu de man ed.

Voici un exemple de session, avec des commentaires ajoutés (non acceptés par 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

EDIT: Comme le mentionne grawity, des messages d’erreur plus utiles peuvent être activés avec hou H. De plus, ,plutôt que %dans la partie portée d’un commandement, c’est la manière officielle de se référer à "toutes les lignes" dans ed. Dans GNU ed, la possibilité de l'utiliser %pour cela est supportée mais n'est pas mentionnée dans le infomanuel. L’utilisation de %pour toutes les lignes a apparemment été inventée par ex, apparemment parce que, là, ,signifie .,.plutôt que 1,$comme dans ed.

EDIT2: Définition d'un éditeur différent

Comme pour les autres réponses mentionnées, si vous souhaitez spécifier un autre éditeur, vous pouvez le faire en définissant les variables d’environnement EDITORou VISUAL. La différence entre les deux est expliquée dans cette réponse .

Vous pouvez le faire comme ceci si vous voulez le définir pour une seule commande:

EDITOR=vi crontab -e

ou comme ceci si vous voulez que tous les programmes lancés dans la session shell l'utilisent:

export EDITOR=vi
crontab -e

Vous pouvez enregistrer le exportdans ~/.profileou /etc/profile, selon si vous voulez qu'il soit un paramètre utilisateur ou d'un système pour bash, respectivement. C'est la manière unix portable de définir l'éditeur. vous pouvez le faire dans n'importe quelle distribution.

Dans Ubuntu, il y a aussi la update-alternativescommande. L'éditeur par défaut actuel peut être vu avec update-alternatives --display editor, et vous pouvez l'utiliser update-alternatives --config editorpour le définir:

$ 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
la source
2
Les versions modernes connaissent les messages d'erreur en anglais, il vous suffit d'utiliser hpour les demander (ou Hpour les activer de manière permanente).
grawity
2
( De plus, %semble être une ex invention officiellement. Ed utilisations ,pour désigner toutes les lignes, même si certaines versions acceptent %aussi bien.)
grawity
Ceci est correct mais devrait également mentionner les variables d'environnement EDITORet VISUAL.
Chrylis -on strike-
La plupart des commandes edsont les mêmes que dans vi, sauf que vous n’avez pas besoin d’appuyer sur ":" pour sortir du mode d’édition graphique. J'ai appris Unix quand les "vrais programmeurs" ne perdaient pas de temps à utiliser des interfaces graphiques - un terminal "écran vert" 80x25 fonctionne presque aussi bien qu'un perforateur de carte IBM 029 pour l'édition, mais pas tout à fait;)
alephzero
@chrylis EDITORet VISUALne sont pas vraiment pertinents. La question était essentiellement: qu'est-ce que cet éditeur et comment l'utiliser? (Qu'est-ce que c'est 0et ceci ?et comment puis-je économiser?)
JoL
39

Comment savoir ce qu'est cet éditeur

Appuyez sur Ctrl+ Z. Cela suspend l'éditeur et vous donne une invite du shell. À l'invite, exécutez pspour voir quels processus sont en cours d'exécution dans ce 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

bashest le shell d'origine, crontabest attendu, shest un autre shell qui doit avoir été appelé par crontabet psest la pscommande en cours d'exécution . Cela laisse ed(fourni par le paquet du même nom ).

Si vous ne savez pas comment quitter l'éditeur, vous pouvez le tuer à ce stade, avec kill 26302ou kill %1.

Qu'est-ce que ed?

Ed est un ancien éditeur, qui remonte à avant que les moniteurs fussent une chose (banale). Il a été conçu pour les ordinateurs dont le périphérique de sortie interactif était un téléimprimeur .

Le nombre 0affiché au début est le nombre de lignes du fichier. Évidemment, c'est une information importante.

?signifie que ed n'a pas compris ce que vous avez tapé. Les imprimantes linéaires étant lentes, ed ne perd pas de temps et d’encre à afficher des informations inutiles telles que des messages d’erreur. Une vieille blague (je ne connais pas l'origine) dit:

Ken Thompson a une automobile qu'il a aidé à concevoir. Contrairement à la plupart des automobiles, il n’a ni indicateur de vitesse, ni jauge d’essence, ni aucun des nombreux autres feux idiots qui affligent le conducteur moderne. Si le conducteur commet une erreur, un «?» Géant s’allume au centre du tableau de bord. "Le pilote expérimenté", dit Thompson, "saura généralement ce qui ne va pas."

Si vous vous sentez inexpérimenté, vous pouvez lancer la commande H(toutes les commandes sauf une sont une seule lettre (sans compter les arguments de données), car ceux qui aiment taper) et vous obtiendrez des messages d'erreur. Par exemple, si vous appuyez simplement sur Enter

?
H
Invalid address

Clair, n'est ce pas? (Une ligne vide est la commande vide - celle qui n’est pas une simple lettre. La commande vide se déplace sur la ligne suivante et l’imprime. Si vous êtes à la fin du fichier, ce qui est toujours le cas dans un champ vide. fichier, il n'y a pas de ligne suivante, donc l'adresse à laquelle vous avez demandé de déplacer est invalide.)

Comment obtenir un autre éditeur

La crontabcommande, comme la plupart des commandes qui exécutent un éditeur de texte, vérifie les variables d'environnement VISUALet EDITOR(dans cet ordre), détermine le programme à exécuter, en revenant à une valeur par défaut du système. Si l'une de ces variables est définie sur ed, modifiez-la ou supprimez-la.

Sous Ubuntu (et Debian et autres), l’éditeur système par défaut /etc/alternatives/editorest géré par le mécanisme des alternatives . Par défaut, il sélectionne le «meilleur» éditeur installé, le «meilleur» étant défini par les priorités définies par les mainteneurs de paquets. Utilisez update-alternativespour configurer une alternative. Vous pouvez afficher les éditeurs disponibles et leurs priorités avec

update-alternatives --display editor

eda la priorité -100, alors que tous les autres éditeurs «sensibles» ont une priorité positive. Par conséquent, la seule façon de l'utiliser par défaut est si aucun éditeur n'a été installé. Une installation par défaut d’Ubuntu utilise nano comme éditeur par défaut, avec une priorité de 400. Si l’alternative a été définie sur ed, vous pouvez la modifier avec

sudo update-alternatives --config editor
Gilles, arrête de faire le mal
la source
Gilles, Sous Ubuntu (et Debian et d’autres), l’éditeur par défaut du système est / etc / alternatives / editor à être reformulé en un Ubuntu (et Debian et d’autres), l’éditeur par défaut du système est / usr / bin / editor ?
Heemayl
assez complet (sauf qu'il ne mentionne pas la variable env. EDITOR? mais peut-être à dessein, afin que les gens utilisent la bonne façon de la définir sur le système via update-alternatives). Peut-être changer cependant: psavec pstree -sap $$ ? (il est plus facile de savoir quel éditeur a été lancé, car il est maintenant sous forme d'arborescence)
Olivier Dulac
@heemayl /usr/bin/editorest un lien symbolique vers /etc/alternatives/editor. Le fait que les applications appellent /usr/bin/editorest un détail que j'ai ignoré.
Gilles 'SO- arrête d'être méchant'
3
@ OlivierDulac je mentionne EDITORet VISUAL. Ils constituent en fait le moyen approprié de choisir un éditeur car il s’agit d’une préférence de l’utilisateur, et non d’une préférence à l’échelle du système. Je préfère rester psici pour que les choses restent simples.
Gilles 'SO- arrête d'être méchant'
1
"... ordinateurs dont le périphérique de sortie interactif était une imprimante linéaire." Une imprimante par ligne n'était pas un périphérique interactif, mais un périphérique relativement rapide (et coûteux) permettant de produire de grandes quantités de documents imprimés. Vous voulez dire "un terminal d'impression avec un clavier", comme un téléscripteur (qui peut également fonctionner comme un périphérique d'E / S à bande de papier perforée) ou une machine à écrire "golfball" d'IBM.
alephzero
12

D'après votre question, il semble que votre viméditeur par défaut ne le soit pas et que vous ayez des problèmes avec l'éditeur par défaut actuel.

La commande ci-dessous définira l'EDITEUR par défaut comme vim

export EDITOR=vim

Après avoir défini l'éditeur par défaut vim, l'exécution crontab -esera utilisée vimcomme éditeur.

Remarques:

  1. Si vous préférez, vous pouvez choisir un autre éditeur comme éditeur par défaut.
  2. Si vous souhaitez définir l'éditeur par défaut en vimpermanence, vous devrez ajouter la commande ci - dessus à votre ~/.bashrcou ~/.profileou d'un fichier similaire.
Yaron
la source
4

Pour utiliser l'éditeur de VI pour éditer la crontab, utilisez la commande ci-dessous.

EDITOR="vi" crontab -e

ou, si vous voulez éditer avec un autre éditeur comme gedit, nano, etc., remplacez simplement vi par le nom de l'éditeur.

harsha
la source
Merci un million! Avec l'EDITEUR = "vi" crontab -e cela fonctionne.
Justme
3
@gronostaj Ce n'est pas la même chose que toute autre réponse postée ici. Définir une variable d'environnement pour une seule exécution d'une seule commande n'est pas la même chose que l'exporter pour toutes les commandes suivantes exécutées à partir de l'instance de shell actuelle. Cette réponse est utile pour modifier le paramètre de manière permanente, mais pour contrôler l'éditeur à la lecture, c'est la bonne réponse.
Eliah Kagan
3
En effet, il est très important de savoir comment ajouter des variables d’environnement sur la ligne de commande, car changer la variable de façon permanente peut ne pas être souhaitable. Une des forces subtiles des coquilles * nix est la capacité de le faire si facilement.
Monty Harder le