Wie kann ich eine Variable in einer laufenden Shell bearbeiten?

8

Ich bearbeite meine PS1-Eingabeaufforderung und möchte meinen bashrc nicht weiter beschaffen, um ihn zu aktualisieren (da mein bashrc auch andere Dinge zurücksetzt). Ich möchte es auch nicht immer wieder kopieren und einfügen. Gibt es eine Möglichkeit, die Variable interaktiv zu bearbeiten, z. B. mit nano(meinem Standardeditor)?

Die PS1 ist meistens ein Beispiel, weil ich das gleiche mit anderen Vars machen möchte. Der Grund, warum ich es interaktiv machen möchte, ist, dass die Variable bereits ziemlich lang ist und ich nur ein paar Zeichen darin bearbeiten muss. Und ich muss es nur in der aktuellen Shell ändern.

wjandrea
quelle

Antworten:

8

Das kann gemacht werden. Geben Sie var=$varund erweitern und bearbeiten es. Verwenden Sie zum Erweitern Esc+ Ctrle(die Standardverknüpfung, überprüfen Sie die Ausgabe von bind -p | grep shell-expand-line, um zu bestätigen).

Damit:

muru@muru-1604:~$ PS1=$PS1

wird werden:

muru@muru-1604:~$ PS1=${debian_chroot:+($debian_chroot)}\u@\h:\w\$

Was Sie dann in einem Editor bearbeiten können Ctrlx Ctrle( edit-and-execute-commandin Readline-Begriffen). Wenn Sie speichern und beenden, wird der gespeicherte Inhalt von der Shell ausgeführt.

Wenn Sie bereits PS1=...in Ihrer Geschichte haben, können Sie einfach darauf zurückkommen und Ctrlx Ctrle.

Aus dem Bash-Handbuch :

shell-expand-line (M-C-e)

Erweitern Sie die Linie wie die Shell. Dies führt eine Alias- und Verlaufserweiterung sowie alle Shell-Worterweiterungen durch.

edit-and-execute-command (C-xC-e)

Rufen Sie einen Editor in der aktuellen Befehlszeile auf und führen Sie das Ergebnis als Shell-Befehle aus. Bash versucht, $ VISUAL, $ EDITOR und emacs als Editor in dieser Reihenfolge aufzurufen.

muru
quelle
Nett! Nur Esc, Strg + E ist genau das, wonach ich gesucht habe. Beim PS1='$PS1'Tippen wurden zwar die Anführungszeichen gelöscht, aber das Tippen PS1=\'$PS1\'funktioniert einwandfrei.
Wjandrea
Beim Durchlesen habe bind -pich auch herausgefunden, dass Sie Globs, Tildes und Verlaufslinien erweitern können. Ordentlich!
Wjandrea
1

Anstatt den bashrc zu beziehen, geben Sie eine andere Datei ein, die nur die Variable enthält.

  1. Erstelle es:

    echo "PS1='$PS1'" > /tmp/PS1
    • Hinweis: Wenn die Variable einfache Anführungszeichen enthält, müssen Sie einen Befehl verwenden, der ihnen entkommen kann, z.

      declare -p PS1 | cut -d' ' -f3- > /tmp/PS1
  2. Öffnen Sie es in einem Editor, z nano /tmp/PS1.

    • Um ein wiederholtes Ausführen zu vermeiden nano, können Sie es in einem anderen Terminal / TTY ausführen oder einen grafischen Editor verwenden.
  3. Nehmen Sie Ihre Änderungen vor und speichern Sie.

  4. Quelle:

    source /tmp/PS1
  5. Wiederholen Sie die Schritte 3 und 4 nach Bedarf.

wjandrea
quelle
1

Zsh verfügt über eine integrierte Funktion vared, mit der Sie eine Variable inline bearbeiten können. Ich habe meine eigene Version geschrieben, die ursprünglich auf Super User gepostet wurde :

vared(){
    # Based on the zsh builtin of the same name.
    IFS= read -rei "${!1}" "$1"
}

Beachten Sie, dass dies einige subtile Unterschiede zum eingebauten Zsh aufweist, z.

  • Wird kein Fehler sein, wenn die Variable nicht gesetzt ist
  • Prüft die Gültigkeit der Variablennamen , bevor ihr Wert Druck (zB vared $)
  • Schneidet mehrzeilige Variablen ab.

Um die PS1 zu bearbeiten, starte sie einfach vared PS1.

wjandrea
quelle
Ich akzeptiere diese Antwort, weil ich sie täglich am meisten
benutze