Jak mogę edytować zmienną w działającej powłoce?

8

Edytuję monit PS1 i nie chcę ciągle pobierać mojego bashrc, aby go zaktualizować (ponieważ mój bashrc resetuje również inne rzeczy). Nie chcę też kopiować i wklejać go w kółko. Czy istnieje sposób interaktywnej edycji zmiennej, na przykład przy użyciu nano(mojego domyślnego edytora)?

PS1 jest głównie przykładem, ponieważ chcę zrobić to samo z innymi wersjami. Powodem, dla którego chcę to robić interaktywnie, jest to, że zmienna jest już dość długa i po prostu muszę w niej edytować kilka znaków. Muszę tylko zmienić to w bieżącej powłoce.

wjandrea
źródło

Odpowiedzi:

8

To może być skończone. Wpisz, var=$vara następnie rozwiń i edytuj. Aby rozwinąć, użyj Esc+ Ctrle(domyślny skrót, sprawdź wyjście w bind -p | grep shell-expand-linecelu potwierdzenia).

Więc:

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

stanie się:

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

Które możesz następnie edytować w edytorze za pomocą Ctrlx Ctrle( edit-and-execute-commandw trybie readline). Kiedy zapiszesz i wyjdziesz, zapisana zawartość zostanie wykonana przez powłokę.

Jeśli masz już PS1=...w swojej historii, możesz po prostu wrócić do tego i Ctrlx Ctrle.

Z podręcznika bash :

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

Rozwiń linię, tak jak robi to powłoka. Spowoduje to rozwinięcie aliasu i historii, a także wszystkich rozszerzeń słów powłoki.

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

Wywołaj edytor w bieżącym wierszu poleceń i wykonaj wynik jako polecenia powłoki. Bash próbuje wywołać $ VISUAL, $ EDITOR i emacs jako edytor, w tej kolejności.

muru
źródło
Miły! Tylko Esc, Ctrl + E jest dokładnie tym, czego szukałem. Chociaż podczas pisania PS1='$PS1'usuwałem cytaty, ale pisanie PS1=\'$PS1\'działa idealnie.
wjandrea
I czytając bind -p, odkryłem również, że możesz rozszerzać globusy, tyldy i linie historii. Schludny!
wjandrea
1

Zamiast pozyskiwać bashrc, źródłowy inny plik, który zawiera tylko zmienną.

  1. Stwórz To:

    echo "PS1='$PS1'" > /tmp/PS1
    • Uwaga: jeśli zmienna zawiera pojedyncze cudzysłowy, będziesz musiał użyć polecenia, które może je uciec, np .:

      declare -p PS1 | cut -d' ' -f3- > /tmp/PS1
  2. Otwórz go w edytorze, np nano /tmp/PS1.

    • Aby uniknąć wielokrotnego uruchamiania nano, możesz uruchomić go w innym terminalu / TTY lub użyć edytora graficznego.
  3. Wprowadź zmiany i zapisz.

  4. Źródło:

    source /tmp/PS1
  5. Powtórz kroki 3 i 4 w razie potrzeby.

wjandrea
źródło
1

Zsh ma wbudowaną funkcję o nazwie, varedktóra pozwala edytować zmienną wbudowaną. Napisałem własną wersję, pierwotnie opublikowaną na Super User :

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

Zauważ, że ma to pewne subtelne różnice w stosunku do wbudowanego Zsh, np .:

  • Nie będzie błędu, jeśli zmienna jest rozbrojona
  • Sprawdza poprawność nazwy zmiennej przed wydrukowaniem jej wartości (np. vared $)
  • Obcina zmienne wieloliniowe.

Następnie, aby edytować PS1, po prostu uruchom vared PS1.

wjandrea
źródło
Akceptuję tę odpowiedź, ponieważ tego najczęściej używam z dnia na dzień
wjandrea