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

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

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

8
задан 27 December 2017 в 22:49

3 ответа

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

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

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

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

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

1
ответ дан 27 December 2017 в 22:49

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

Итак:

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

станут:

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

, которые затем вы можете редактировать в редакторе с помощью Ctrl x Ctrl e (edit-and-execute-command в терминах readline). При сохранении и выходе сохраненный контент будет выполнен оболочкой.

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

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

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

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

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

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

8
ответ дан 27 December 2017 в 22:49
  • 1
    В то время как это может теоретически ответить на вопрос, было бы предпочтительно включать информацию здесь и оставить ссылки как ссылки. – Mark Paskal 12 March 2013 в 01:48
  • 2
    В то время как это может теоретически ответить на вопрос, было бы предпочтительно включать информацию здесь и оставить ссылки как ссылки. – Mark Paskal 12 March 2013 в 01:48
  • 3
    В то время как это может теоретически ответить на вопрос, было бы предпочтительно включать информацию здесь и оставить ссылки как ссылки. – Mark Paskal 12 March 2013 в 01:48
  • 4
    В то время как это может теоретически ответить на вопрос, было бы предпочтительно включать информацию здесь и оставить ссылки как ссылки. – Mark Paskal 12 March 2013 в 01:48
  • 5
    В то время как это может теоретически ответить на вопрос, было бы предпочтительно включать информацию здесь и оставить ссылки как ссылки. – Mark Paskal 12 March 2013 в 01:48
  • 6
    В то время как это может теоретически ответить на вопрос, было бы предпочтительно включать информацию здесь и оставить ссылки как ссылки. – Mark Paskal 12 March 2013 в 01:48

Вместо того, чтобы использовать 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.

1
ответ дан 27 December 2017 в 22:49

Другие вопросы по тегам:

Похожие вопросы: