web-dev-qa-db-fra.com

Quel est cet éditeur qui est ouvert par crontab?

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, cela m'a donné un ?. Et pourquoi ça me donne un zéro?

Quand je tape un q et appuyez sur Enter - il quitte. J'ai besoin de savoir comment économiser, car ce n'est pas un Vi classique.

41
justme

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 par ?. Vous pouvez interpréter cela comme "êtes-vous sûr?" Et confirmez en commandant à nouveau q. 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 basées sur vim/vi/ex/sed. Des commandes telles que g/re/p, %s/vi/&m/g, 1,3d, /pattern/,$d, w, q, wq fonctionnent exactement comme vim.

Des commandes telles que i, a et c passent en mode insertion. Pour quitter le mode insertion et revenir au mode commande, entrez simplement une ligne contenant uniquement un .. Pour "déplacer" une autre ligne, entrez simplement le numéro de la ligne, un décalage par rapport à la ligne actuelle, comme +2 ou -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 la dernière ligne.

Soit dit en passant, si vous voulez en savoir plus à ce sujet, il s’agit d’un programme GNU sous Linux, la majeure partie de sa documentation est au format info ed au lieu 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 h ou H. De plus, , plutôt que % dans la partie plage d'une commande est le moyen officiel de faire référence à "toutes les lignes" dans ed. Dans GNU ed, la possibilité d'utiliser % à cette fin est prise en charge mais n'est pas mentionnée dans le manuel info. L'utilisation de % pour toutes les lignes a apparemment été inventée par ex, apparemment parce que, ici, , 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 EDITOR ou 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 export dans ~/.profile ou /etc/profile, selon que vous souhaitiez qu'il s'agisse d'un paramètre utilisateur ou 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 existe également la commande update-alternatives. L'éditeur par défaut actuel peut être vu avec update-alternatives --display editor, et vous pouvez utiliser update-alternatives --config editor pour 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.
65
JoL

Comment savoir ce qu'est cet éditeur

Presse Ctrl+Z. Cela suspend l'éditeur et vous donne une invite du shell. À l'invite, exécutez ps pour 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

bash est le Shell d'origine, crontab est attendu, sh est un autre Shell qui doit avoir été appelé par crontab et ps est la commande en cours ps. Cela laisse ed (fourni par le paquetage du même nom ).

Si vous ne savez pas comment quitter l'éditeur, vous pouvez le tuer à ce stade, avec kill 26302 ou 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 est un téléimprimeur .

Le 0 qu'il affiche 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 émettre 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 vous déplacer est invalide.)

Comment obtenir un autre éditeur

La commande crontab, comme la plupart des commandes qui exécutent un éditeur de texte, vérifie les variables d'environnement VISUAL et EDITOR (dans cet ordre) pour déterminer 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 d’autres), l’éditeur par défaut du système est /etc/alternatives/editor, qui est géré via le mécanisme alternatif . 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-alternatives pour configurer une alternative. Vous pouvez afficher les éditeurs disponibles et leurs priorités avec

update-alternatives --display editor

ed a 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
39
Gilles

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

La commande ci-dessous définira l'EDITEUR par défaut sur vimname__

export EDITOR=vim

Après avoir défini l'éditeur par défaut sur vimname__, l'exécution de crontab -e utilisera vimen tant qu'é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 sur vimde manière permanente, vous devez ajouter la commande ci-dessus à votre ~/.bashrc ou ~/.profile ou à un fichier similaire.
12
Yaron

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.

4
harsha