Vi - ESC in Terminal (Bashskript )

FirstDau

Cadet 4th Year
Registriert
Sep. 2018
Beiträge
81
Guten Tag meine Damen und Herren,

ich bin gerade an einem Skript, mit dem ein Dienst (cleardownloads) beim Aufstarten ausgeführt werden soll.
Eigentlich funktioniert alles, nur bei der Erstellung des Crontabs mittels vi-Editor direkt im Bashskript, habe ich Probleme.

...
Bash:
export VISUAL=vi                                   #Setzt vi als Editor

crontab -e                                         #Erstellt einen Crontab und öffnet diesen mittels vi-Editor im Terminal

G                                                  #Cursor an letzte Zeile

i                                                  #Aktiviert Insertmode

@reboot /etc/init.d/cleardownloads                 # Text, der in dieser Zeile stehen sollte

\E                                                 #Verzweifelter Versuch, vom Eingabemode zum Kommandomode zu wechseln

:wq!                                               #Verzweifelter Versuch, den Crontab zu speichern und schliessen
...


Mein Knüppel ist die Tatsache, dass ich kein Mittel finde, vom Eingabemodus wieder in den Kommandomodus zu kommen.
Versucht habe ich es bereits mit:

\E
:x\n


Aber weitere Befehle finde ich dazu einfach nicht.

Da ich im Verlauf des Skriptes immer wieder den vi-Editor benutzt habe und nun vi als Standardeditor belassen möchte, wäre ich froh um ergänzende Befehle. Ich weiss, es gibt auch andere Methoden, aber es muss doch irgendwie möglich sein, im Terminal mit vi vom Eingabemodus zum Kommandomodus zu wechseln?
 
Wieso willst Du den CRON-Job via VI eintragen und nicht einfach die entsprechende cron-Datei anpassen?
 
Darf ich mal fragen was du eigentlich versuchst? Beschreibe bitte nicht wie du versuchst, es zu lösen, sondern was deine Intention ist.

Entweder fügst du den job manuell in die crontab ein oder wenn es Teil eines Skripts sein soll zB mit echo "ein cronjob" >> /pfad/zu/crontab Wobei du natürlich aufpassen musst, dass das nicht drölfzig mal passiert, sondern nur einmalig.
 
Trag doch einfach
Code:
@reboot /etc/init.d/cleardownloads
in deinen crontab ein.
Crontab öffnest du einfach in der Konsole mittels crontab -e
 
Raijin schrieb:
Darf ich mal fragen was du eigentlich versuchst? Beschreibe bitte nicht wie du versuchst, es zu lösen, sondern was deine Intention ist.

Entweder fügst du den job manuell in die crontab ein oder wenn es Teil eines Skripts sein soll zB mit echo "ein cronjob" >> /pfad/zu/crontab Wobei du natürlich aufpassen musst, dass das nicht drölfzig mal passiert, sondern nur einmalig.

Nun, da hast du mit Skript ins Schwarze getroffen, wie schon oben geschrieben, sollte dieser Teil dann in ein etwas längeres und komplexeres Bashskript eingebunden werden. Ziel dieses Skripts ist es, dass ich dann nicht auf jedem einzelnen Gerät diese Sachen manuell eintippen muss, sondern einen Stick einschieben kann, Skript rüberziehen, Skript ausführen, Stick entfernen und finito.
Ergänzung ()

meph!sto schrieb:
Trag doch einfach
Code:
@reboot /etc/init.d/cleardownloads
in deinen crontab ein.
Crontab öffnest du einfach in der Konsole mittels crontab -e

Na das ist mir klar, dieser Befehl steht in meinem Skript ja schon. Nur geht es mir darum, dass ich im Terminal mittels vi-Editor aus dem Eingabemodus in den Kommandomodus/Befehlsmodus komme, denn im Terminal geht ESC nicht. Und \E und :x\n auch nicht.
Ergänzung ()

Hier im Bild sieht man vielleicht besser was ich meine.

Das ist nun der mit vi geöffnete Crontab. Klar, ich könnte nun ESC drücken, um zurück in den Befehlsmodus zu kommen. Aber während dem Bashskript kann ich ja nicht " ESC " eingeben, da benötige ich einen Befehl, der das übernimmt. Und die Frage der Fragen: Welcher Befehl ist das/Gibt es einen solchen Befehl?
Ergänzung ()

Okay, ich glaube, dass mir dabei niemand helfen will/kann.

Falls jemand mit dem gleichen Problem auf diesen Thread stösst:
Ich habe es nun unzufriedenermassen anders lösen müssen, aber ne einfache Alternative mit cat:

Bash:
cat <(crontab -l) <(echo "@reboot /etc/init.d/cleardownloads") | crontab -
 

Anhänge

  • bashscript.PNG
    bashscript.PNG
    25,9 KB · Aufrufe: 262
Zuletzt bearbeitet:
Sorry, aber ich verstehe nicht was du immer von vi und Skript willst?!? Hast du vor vi im Skript fernzubedienen oder was? vi ist ein Editor und kein Tool, das du in einem Skript automatisierst. Du gehst das ganze völlig falsch an. vi im Skript fernzubedienen ist vergleichbar mit einem Excel-Makro, das keine Kommandos ausführt, sondern die Maus fernsteuert und auf die Menüs klickt. So macht man das einfach nicht und deswegen stößt du auch auf Probleme, die du nicht hättest, wenn du es ohne Editor im Skript machen würdest.
 
Raijin schrieb:
Sorry, aber ich verstehe nicht was du immer von vi und Skript willst?!? Hast du vor vi im Skript fernzubedienen oder was? vi ist ein Editor und kein Tool, das du in einem Skript automatisierst. Du gehst das ganze völlig falsch an. vi im Skript fernzubedienen ist vergleichbar mit einem Excel-Makro, das keine Kommandos ausführt, sondern die Maus fernsteuert und auf die Menüs klickt. So macht man das einfach nicht und deswegen stößt du auch auf Probleme, die du nicht hättest, wenn du es ohne Editor im Skript machen würdest.

Sorry, dann bist du wohl schwer von Begriff. Ich schreibe wiederholt:

Ich suche nur einen Befehl, der mit dem ESC bei vi gleichzustellen ist, sprich dass man vom Eingabemodus zum Befehlsmodus wechseln kann, ohne ESC drücken zu müssen, nur mit einem Befehl. Oder das Wissen, dass es den gar nicht gibt.

Wie wenn man beim vi-Editor i drückt(und somit in den Eingabemodus wechselt), einen Text eingibt und dann ESC drückt(um wieder in den Kommandomodus zu wechseln) und abschliessend mit einem :wq! abspeichert und die Datei schliesst. Nur statt ESC-Taste als Befehl. So einfach.

Ich brauche weder Aussagen wie "Du gehst das ganze völlig falsch an", noch "So macht man das nicht". Lediglich ne Antwort auf meine Frage. Vi ist von mir gezielt ausgewählt worden, damit ich mich neben dem Hauptzweck nebensächlich mal mit diesem Editor auseinandersetzen kann und nicht, damit ich das vorbildlichste Skript der Geschichte unserer Menschheit schreiben kann.
 
Mal völlig davon abgesehen, dass ich mir einfach keine Anwendung für dein Vorhaben vorstellen kann, kannst du mir/uns nur kurz erklären warum sowas machen möchte ? Ich kann mir einfach kein Szenario vorstellen indem ich/irgendwer sowas benötigen würde, daher die Bitte es kurz zu beschreiben/erklären.

Wenn es nämlich nur darum gehen würde mittels einem Skript
Code:
@reboot /etc/init.d/cleardownloads
in den crontab zu schreiben, dann würde eben ein
Code:
echo "@reboot /etc/init.d/cleardownloads" >> /pfad/zum/crontab
reichen.

Und es geht hier nicht darum dass man dir nicht helfen will, nur führen oftmals mehrere Wege ans gewünschte Ziel.
 
Zuletzt bearbeitet:
FirstDau schrieb:
Ich brauche weder Aussagen wie "Du gehst das ganze völlig falsch an", noch "So macht man das nicht". Lediglich ne Antwort auf meine Frage. Vi ist von mir gezielt ausgewählt worden, damit ich mich neben dem Hauptzweck nebensächlich mal mit diesem Editor auseinandersetzen kann und nicht, damit ich das vorbildlichste Skript der Geschichte unserer Menschheit schreiben kann.
Das hat auch keiner gesagt. Aber du suchst hier Hilfe, weil du offenbar nicht weiterkommst. Das wiederum impliziert, dass deine Kenntnisse dieses Problem betreffend eingeschränkt sind - das ist ja nix schlimmes. Wenn einem die Kenntnisse für etwas fehlen, dann wählt man aber unter Umständen auch den falschen Weg, dieses Problem überhaupt anzugehen. Es ist daher vollkommen normal, wenn dir Alternativen aufgezeigt werden, die deine bestehenden Probleme gar nicht erst entstehen lassen.

FirstDau schrieb:
Sorry, dann bist du wohl schwer von Begriff.
  1. Musst du nicht persönlich werden
  2. Klingt es nach wie vor so als wenn du vi mit dem Skript fernsteuern willst - oder ich kapiere wirklich nicht was du vorhast.
In Beitrag #3 habe ich dich gefragt was dein eigentliches Ziel ist und nicht "wie du es zu lösen versuchst". Das war auf ein klassisches XY-Problem bezogen. Für mich lesen sich deine Aussagen nämlich nach wie vor so als wenn du auf Biegen und Brechen versuchst, das Problem mit deiner Lösung zu lösen, die aber vielleicht gar nicht für dein zugrundeliegendes Vorhaben geeignet ist - nämlich das Hinzufügen eines Cronjobs via Skript (so habe ich deine Basis-Intention zumindest verstanden).
Wenn du sagst, dass du einen "Befehl" im Skript suchst, mit dem du das ESC von vi reproduzieren kannst, deutet das eben für mich zumindest darauf hin, dass du tatsächlich versuchst, vi fernzusteuern.

Wenn man mit einem Skript eine Datei bearbeiten möchte, tut man dies nicht, indem man aus dem Skript heraus einen Editor startet und dann versucht diesen Editor aus dem Skript heraus zu steuern. Stattdessen editiert man die Datei direkt, im einfachsten Falle eben sogar mit

echo "blabla123" >> blabla.txt

Diese Zeile hängt den Text "blabla123" ans Ende der Datei blabla.txt an. Der vorherige Inhalt bleibt erhalten und um den besagten Text ergänzt.

echo "blabla234" > blabla.txt

Diese Zeile überschreibt die Datei blabla.txt mit dem Text "blabla234" (man beachte das einfache > vs >>). Der vorherige Inhalt geht verloren und die Datei beinhaltet danach nur noch den besagten Text.
 
Wenn man einen Text aus einem Skript heraus (d.h. NICHT INTERAKTIV) editieren möchte, ist die Wahl von vi unter Verwendung des INTERAKTIVEN Modus (in den man im vi mit 'i', 'A' u.ä. kommt) als Werkzeug doch irgendwie ein bischen abwegig, nicht? Im Skript ganz ohne steuerndes Terminal ist das Hantieren mit Terminal-Steuerzeichen halt "schwer". Naheliegend wäre die Verwendung von nicht interaktiven "Texteditoren" wie sed oder awk für so einfache Sachen wie das Einfügen einer Zeile. sed-Kommandos sind sogar halbwegs nah an vi.

FirstDau schrieb:
Vi ist von mir gezielt ausgewählt worden, damit ich mich neben dem Hauptzweck nebensächlich mal mit diesem Editor auseinandersetzen kann und nicht, damit ich das vorbildlichste Skript der Geschichte unserer Menschheit schreiben kann.
lol Sorry. Schade, dass du nicht ganz gezielt einen Rasenmäher zum Texteditieren ausgewählt hast, weil du dich schon immer mal mit Rasenmähern auseinandersetzen wolltest.

Falls dir der Rasenmäher ein ungeeignetes Werkzeug für die Aufgabe zu sein scheint: Stimmt. Haargenau so ungeeignet wie vi. Bingo? Man sollte seine Werkzeugauswahl offenar nach anderen Kriterien als "das Ding wollte ich auch mal kennenlernen" treffen.
 
Zuletzt bearbeitet:
Zurück
Oben