Was ist dieser Editor, der von crontab geöffnet wird?

41

Ich möchte Crontab bearbeiten. Es soll Vi sein, ist es aber nicht, wie Sie sehen können:

root@euve252628:~# crontab -e

0

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

?

:wq

?

Ja, es gab mir eine ?. Und warum gibt es mir eine Null?

Wenn ich a eingebe qund drücke, wird Enteres beendet. Ich muss wissen, wie man spart, weil es kein klassisches Vi ist.

nur ich
quelle
5
Höchstwahrscheinlich ed: Standardmäßig wird eine Zeichenanzahl angegeben (in Debian-basierten Systemen ist dies normalerweise 888das erste Mal, dh die Anzahl der Zeichen in der "leeren" crontab-Vorlage). Wenn Sie eine Anzahl von 0 sehen, müssen Sie dies geändert haben. Siehe Crontab -e Befehl funktioniert nicht richtig
Steeldriver
31
Ed, Mann! ! man ed: gnu.org/fun/jokes/ed-msg.html
juhist
6
@juhist Anstelle eines Kommentars sollte dies die Antwort sein.
Dessert
1
Während Sie normalerweise nur EDITORetwas anderes überschreiben möchten , wenn Sie daran interessiert sind, ed tatsächlich zu verwenden, ist dies eine großartige Einführung: sanctum.geek.nz/arabesque/actually-using-ed
Xiong Chiamiov
@justme, übrigens, herzlich willkommen bei StackExchange! Wenn Sie eine Antwort finden, die Ihre Frage am besten beantwortet, können Sie sie annehmen, indem Sie auf das Häkchen neben der Frage klicken.
JoL

Antworten:

65

Das ist ed

Standardmäßig ist die Eingabeaufforderung die leere Zeichenfolge. Wenn Sie beenden möchten, geben Sie einfach ein q. Nicht voranstellen mit :. Wenn Sie nicht gespeicherte Änderungen vorgenommen haben, wird mit geantwortet ?. Sie können dies als "Sind Sie sicher?" Interpretieren und mit einem qerneuten Befehl bestätigen . Übrigens wird jeder Befehl, den es nicht versteht, auch dazu führen, dass es antwortet ?. Das ist die einzige Fehlermeldung, die es kennt.

Seine Befehle sind , was vim / vi / ex / sed basiert auf, so Befehle wie g/re/p, %s/vi/&m/g, 1,3d, /pattern/,$d, w, q, wqfunktionieren genauso wie vim.

Befehle wie i, aund cgehen in den Einfügemodus. Um den Einfügemodus zu verlassen und zum Befehlsmodus zurückzukehren, geben Sie einfach eine Zeile ein, die nur a enthält .. Um in eine andere Zeile zu "wechseln", geben Sie einfach die Zeilennummer, einen Versatz von der aktuellen Zeile wie +2oder -1oder einen regulären Ausdruck als Befehl ein, um zu dieser Zeile zu wechseln . .Bedeutet die aktuelle Zeile im Befehlsmodus. Sie können es verwenden, um zu wissen, wo Sie sich gerade befinden. $bedeutet letzte Zeile.

Übrigens, wenn Sie mehr darüber erfahren möchten, da es sich um ein GNU-Programm unter Linux handelt, ist der größte Teil der Dokumentation in info edstatt man ed.

Hier ist eine Beispielsitzung mit hinzugefügten Kommentaren (von ed nicht akzeptiert):

$ 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

BEARBEITEN: Wie bei Grawity Erwähnungen können mit hoder hilfreichere Fehlermeldungen aktiviert werden H. Auch ,nicht %im Bereich Teil eines Befehls ist der offizielle Weg , um „alle Linien“ in Bezug zu nehmen ed. In GNU edwird die Möglichkeit dazu %unterstützt, aber im infoHandbuch nicht erwähnt . Die Verwendung %für alle Zeilen wurde anscheinend erfunden ex, weil dort eher ,Mittel .,.als Mittel 1,$wie in ed.

EDIT2: Einen anderen Editor einstellen

Wie bei den anderen genannten Antworten können Sie einen anderen Editor angeben, indem Sie die Umgebungsvariablen EDITORoder festlegen VISUAL. Der Unterschied zwischen den beiden wird in dieser Antwort erklärt .

Sie können dies folgendermaßen tun, wenn Sie es für einen einzelnen Befehl festlegen möchten:

EDITOR=vi crontab -e

oder so, wenn Sie möchten, dass alle in der Shell-Sitzung gestarteten Programme diese verwenden:

export EDITOR=vi
crontab -e

Sie können die Einstellungen exportin ~/.profileoder speichern /etc/profile, je nachdem, ob es sich um Benutzer- oder Systemeinstellungen für die Bash handelt. Auf diese Weise können Sie den Editor unter Unix portabel einstellen. Sie können dies in jeder Distribution tun.

In Ubuntu gibt es auch den update-alternativesBefehl. Der aktuelle Standardeditor wird mit angezeigt update-alternatives --display editor, und Sie können ihn update-alternatives --config editorfestlegen:

$ 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
quelle
2
Moderne Versionen kennen englische Fehlermeldungen. Sie müssen sie nur verwenden h, um sie anzufordern (oder Hum sie dauerhaft zu aktivieren).
Grawity
2
(Auch %scheint eine sein ex Erfindung offiziell. Ed Verwendungen ,alle Linien zu bedeuten, auch wenn einige Versionen akzeptieren %auch.)
grawity
Dies ist korrekt , sollte aber auch die Umgebungsvariablen EDITORund erwähnen VISUAL.
chrylis -on strike-
Die meisten Befehle in edsind die gleichen wie in vi, außer dass Sie nicht zuerst ":" drücken müssen, um den Grafikbearbeitungsmodus zu verlassen. Ich habe Unix gelernt, als "echte Programmierer" keine Zeit mit GUIs verschwendeten - ein 80x25 "Green Screen" Terminal funktioniert fast so gut wie ein IBM 029
Kartenlocher
@chrylis EDITORund VISUALsind nicht wirklich so relevant. Die Frage war im Grunde: Was ist dieser Editor und wie verwende ich ihn? (Was ist das 0und das ?und wie speichere ich?).
JoL
39

So finden Sie heraus, was dieser Editor ist

Drücken Sie Ctrl+ Z. Dadurch wird der Editor angehalten und Sie erhalten eine Shell-Eingabeaufforderung. Führen Sie psan der Eingabeaufforderung aus, um zu sehen, welche Prozesse in diesem Terminal ausgeführt werden.

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

bashist die ursprüngliche Shell, crontabwird erwartet, shist eine andere Shell, die aufgerufen worden sein muss crontab, und psist der ausgeführte psBefehl. Das geht ed(bereitgestellt durch das Paket mit dem gleichen Namen ).

Wenn Sie nicht herausfinden können, wie Sie den Editor beenden können, können Sie ihn an dieser Stelle mit kill 26302oder beenden kill %1.

Was ist ed

Ed ist ein uralter Redakteur, der aus einer Zeit stammt, als Monitore noch keine Selbstverständlichkeit waren. Es wurde für Computer entwickelt, deren interaktives Ausgabe-Peripheriegerät ein Fernschreiber war .

Am 0Anfang wird die Anzahl der Zeilen in der Datei angezeigt. Offensichtlich ist das eine wichtige Information.

?bedeutet, dass ed nicht verstanden hat, was Sie eingegeben haben. Zeilendrucker sind langsam, daher verschwendet ed keine Zeit und Tinte, um sinnlose Informationen wie Fehlermeldungen anzuzeigen. Ein alter Witz (ich kenne den Ursprung nicht) lautet:

Ken Thompson hat ein Automobil, an dessen Design er mitgewirkt hat. Im Gegensatz zu den meisten Autos gibt es weder einen Tacho noch eine Tankanzeige oder eines der zahlreichen anderen idiotischen Lichter, die den modernen Fahrer plagen. Wenn der Fahrer einen Fehler macht, leuchtet ein riesiges "?" In der Mitte des Armaturenbretts auf. "Der erfahrene Fahrer", sagt Thompson, "wird normalerweise wissen, was los ist."

Wenn Sie sich unerfahren fühlen, können Sie den Befehl ausgeben H(alle Befehle außer einem sind ein einziger Buchstabe (Datenargumente werden nicht gezählt), denn wer tippt gerne), und Sie erhalten Fehlermeldungen. Zum Beispiel, wenn Sie nur drücken Enter...

?
H
Invalid address

Klar, nicht wahr? (Eine leere Zeile ist der leere Befehl - der Befehl, bei dem es sich nicht um einen einzelnen Buchstaben handelt. Der leere Befehl wechselt in die nächste Zeile und druckt ihn aus. Wenn Sie sich am Ende der Datei befinden, ist dies bei einem leeren immer der Fall Datei gibt es keine nächste Zeile, daher ist die Adresse, zu der Sie verschoben haben, ungültig.)

Wie bekomme ich einen anderen Editor?

Der crontabBefehl überprüft, wie die meisten Befehle, die einen Texteditor ausführen, die Umgebungsvariablen VISUALund EDITOR(in dieser Reihenfolge), um zu entscheiden, welches Programm ausgeführt werden soll. Dabei wird auf einen Systemstandard zurückgegriffen. Wenn eine dieser Variablen auf gesetzt ist ed, ändern oder entfernen Sie sie.

Unter Ubuntu (und Debian und anderen) ist der Standardeditor des Systems /etc/alternatives/editor, der über den Alternativmechanismus verwaltet wird . Standardmäßig wird der beste installierte Editor ausgewählt, wobei der beste durch die von den Paketbetreuern festgelegten Prioritäten definiert wird. Verwenden Sie update-alternativesdiese Option, um eine Alternative zu konfigurieren. Mit können Sie sich die verfügbaren Editoren und deren Prioritäten anzeigen lassen

update-alternatives --display editor

edhat die Priorität -100, wohingegen alle anderen "vernünftigen" Editoren eine positive Priorität haben. Die einzige Möglichkeit, wie dies standardmäßig verwendet wird, ist, wenn kein Editor installiert wurde. Bei einer Standardinstallation von Ubuntu wird Nano als Standardeditor mit der Priorität 400 verwendet. Wenn die Alternative auf festgelegt wurde, edkönnen Sie sie mit ändern

sudo update-alternatives --config editor
Gilles 'SO - hör auf böse zu sein'
quelle
Gilles, sollte nicht unter Ubuntu (und Debian und anderen) der Standardeditor des Systems / etc / alternatives / editor in On Ubuntu (und Debian und anderen) umformuliert werden , ist der Standardeditor des Systems / usr / bin / editor ?
Heemayl
ziemlich umfangreich (außer, dass die Variable EDITOR env nicht erwähnt wird? aber vielleicht absichtlich, damit die Leute die richtige Methode verwenden, um sie über Update-Alternativen auf dem System einzustellen). Vielleicht aber ändern: psmit pstree -sap $$ ? (leichter herauszufinden, welcher Editor gestartet wurde, da er jetzt in einem Baumformat vorliegt)
Olivier Dulac
@heemayl /usr/bin/editorist ein Symlink zu /etc/alternatives/editor. Die Tatsache, dass Anwendungen aufgerufen werden, /usr/bin/editorist ein Detail, das ich übersprungen habe.
Gilles 'SO- hör auf böse zu sein'
3
@OlivierDulac erwähne ich EDITORund VISUAL. Sie sind in der Tat die richtige Art, einen Editor auszuwählen, da dies eine Benutzerpräferenz und keine systemweite Präferenz ist. Ich bleibe lieber pshier, um die Dinge einfach zu halten.
Gilles 'SO - hör auf böse zu sein'
1
"... Computer, deren interaktives Ausgabe-Peripheriegerät ein Zeilendrucker war." Ein Zeilendrucker war kein interaktives Gerät - es war ein relativ schnelles (und teures) Gerät zur Erzeugung großer Mengen gedruckter Ausgaben. Sie meinen "ein Druckerterminal mit einer Tastatur", wie einen Fernschreiber (der auch als Lochstreifen-E / A-Gerät verwendet werden kann) oder eine IBM "Golfball" -Schreibmaschine.
Alephzero
12

Aus Ihrer Frage geht hervor, dass Ihr vimStandard-Editor dies nicht ist und Sie Probleme mit dem aktuellen Standard-Editor haben.

Der folgende Befehl setzt den Standard-EDITOR auf vim

export EDITOR=vim

Nach dem Einstellen des Standard - Editor zu sein vim, läuft crontab -ewird verwenden vimals Editor.

Anmerkungen:

  1. Wenn Sie möchten, können Sie einen anderen EDITOR als Standardeditor auswählen
  2. Wenn Sie den Standard - Editor festlegen möchten vimpermanent, werden Sie den obigen Befehl zu Ihrer hinzufügen müssen ~/.bashrcoder ~/.profileoder ähnliche Datei.
Yaron
quelle
4

Verwenden Sie den folgenden Befehl, um den VI-Editor zum Bearbeiten der Crontab zu verwenden.

EDITOR="vi" crontab -e

Oder, wenn Sie mit einem anderen Editor wie gedit, nano usw. bearbeiten möchten, ersetzen Sie einfach vi durch den Namen des Editors.

Harsha
quelle
Vielen Dank eine Million! Mit dem EDITOR = "vi" crontab -e funktioniert es.
Justme
3
@gronostaj Dies ist nicht dasselbe wie jede andere Antwort, die hier gepostet wurde. Das Festlegen einer Umgebungsvariablen für eine einzelne Ausführung eines einzelnen Befehls entspricht nicht dem Exportieren für alle nachfolgenden Befehle, die von der aktuellen Shell-Instanz ausgeführt werden. Diese Antwort ist nützlich, um die Einstellung dauerhaft zu ändern, aber um den Editor pro Lauf zu steuern, ist dies die richtige Antwort.
Eliah Kagan
3
In der Tat ist es sehr wichtig zu wissen, wie Umgebungsvariablen in der Befehlszeile vorangestellt werden, da eine dauerhafte Änderung der Variablen unerwünscht sein kann. Eine der subtilen Stärken der * nix-Shells ist die Fähigkeit, dies so einfach zu tun.
Monty Harder