Как я могу редактировать переменную в работающей оболочке?

8

Я редактирую приглашение PS1, и я не хочу продолжать использовать мой bashrc для его обновления (поскольку мой bashrc сбрасывает и другие вещи). Я также не хочу копировать и вставлять это снова и снова. Есть ли способ редактировать переменную в интерактивном режиме, например, используя nano(мой редактор по умолчанию)?

PS1 в основном пример, потому что я хочу сделать то же самое с другими переменными. Причина, по которой я хочу сделать это в интерактивном режиме, заключается в том, что переменная уже довольно длинная, и мне просто нужно отредактировать в ней несколько символов. И мне нужно только изменить его в текущей оболочке.

wjandrea
источник

Ответы:

8

Это можно сделать. Введите, var=$varа затем разверните и отредактируйте его. Чтобы развернуть, используйте Esc+ Ctrle(ярлык по умолчанию, проверьте вывод bind -p | grep shell-expand-lineдля подтверждения).

Так:

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

станет:

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

Который вы можете затем редактировать в редакторе Ctrlx Ctrle( edit-and-execute-commandв терминах readline). При сохранении и выходе сохраненный контент будет выполнен оболочкой.

Если у вас уже есть PS1=...в вашей истории, вы можете просто вернуться к этому и Ctrlx Ctrle.

Из руководства по bash :

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

Разверните строку, как это делает оболочка. Это выполняет расширение псевдонима и истории, а также все расширения слов оболочки.

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

Вызвать редактор в текущей командной строке и выполнить результат как команды оболочки. Bash пытается вызвать $ VISUAL, $ EDITOR и emacs в качестве редактора в указанном порядке.

Мур
источник
Ницца! Просто Esc, Ctrl + E именно то, что я искал. Хотя, когда я печатал PS1='$PS1', он удалял кавычки, но набор текста PS1=\'$PS1\'работает отлично.
wjandrea
И, прочитав bind -p, я также узнал, что вы можете расширить глобусы, тильды и линии истории. Ухоженная!
wjandrea
1

Вместо того, чтобы использовать bashrc, создайте другой файл, который просто содержит переменную.

  1. Создать это:

    echo "PS1='$PS1'" > /tmp/PS1
    • Примечание. Если переменная содержит одинарные кавычки, вам необходимо использовать команду, которая может их экранировать, например:

      declare -p PS1 | cut -d' ' -f3- > /tmp/PS1
  2. Откройте его в редакторе, например nano /tmp/PS1.

    • Чтобы избежать повторного запуска nano, вы можете запустить его в другом терминале / TTY или использовать графический редактор.
  3. Внесите свои изменения и сохраните.

  4. Источник это:

    source /tmp/PS1
  5. Повторите шаги 3 и 4 по мере необходимости.

wjandrea
источник
1

Zsh имеет встроенную функцию, varedкоторая позволяет вам редактировать переменную inline. Я написал свою собственную версию, первоначально размещенную на Super User :

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

Обратите внимание, что в этом есть некоторые тонкие отличия от встроенных в Zsh, например:

  • Не будет ошибки, если переменная не установлена
  • Проверяет правильность имени переменной перед печатью ее значения (например vared $)
  • Усекает многострочные переменные.

Затем, чтобы редактировать PS1, просто запустите vared PS1.

wjandrea
источник
Принятие этого ответа, потому что это то, что я использую больше всего в день
wjandrea