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

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

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

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

7 ответов

Это можно сделать. Введите 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\$

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

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

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

shell-expand-line (M-C-e) Разверните линию, как это делает оболочка. Это выполняет расширение псевдонима и истории, а также все расширения слова оболочки. edit-and-execute-command (C-xC-e) Вызвать редактор текущей командной строки и выполнить результат в виде команд оболочки. Bash пытается вызвать в этом порядке $ VISUAL, $ EDITOR и emacs в качестве редактора.
8
ответ дан 22 May 2018 в 15:55
  • 1
    Ницца! Просто Esc, Ctrl + E - именно то, что я искал. Хотя, когда я набрал PS1='$PS1', он удалил кавычки, но набрав PS1=\'$PS1\', отлично работает. – wjandrea 27 December 2017 в 06:04
  • 2
    И, прочитав bind -p, я также узнал, что вы можете расширять глобусы, тильды и истории. Ухоженная! – wjandrea 27 December 2017 в 06:07

Это можно сделать. Введите 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\$

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

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

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

shell-expand-line (M-C-e) Разверните линию, как это делает оболочка. Это выполняет расширение псевдонима и истории, а также все расширения слова оболочки. edit-and-execute-command (C-xC-e) Вызвать редактор текущей командной строки и выполнить результат в виде команд оболочки. Bash пытается вызвать в этом порядке $ VISUAL, $ EDITOR и emacs в качестве редактора.
8
ответ дан 18 July 2018 в 00:24

Это можно сделать. Введите 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\$

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

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

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

shell-expand-line (M-C-e) Разверните линию, как это делает оболочка. Это выполняет расширение псевдонима и истории, а также все расширения слова оболочки. edit-and-execute-command (C-xC-e) Вызвать редактор текущей командной строки и выполнить результат в виде команд оболочки. Bash пытается вызвать в этом порядке $ VISUAL, $ EDITOR и emacs в качестве редактора.
8
ответ дан 24 July 2018 в 17:12

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

Создайте его:
echo "PS1='$PS1'" > /tmp/PS1
Примечание. Если переменная содержит одинарные кавычки, вам нужно будет использовать команду, которая может избегать их, например:
declare -p PS1 | cut -d' ' -f3- > /tmp/PS1
Открыть его в редакторе, например [F4]. Чтобы избежать повторного запуска nano, вы можете запустить его в другом терминале / TTY или использовать графический редактор. Внесите свои изменения и сохраните. Источник:
source /tmp/PS1
Повторите шаги 3 и 4 по мере необходимости.
1
ответ дан 22 May 2018 в 15:55

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

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

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

Не будет ошибки, если переменная unset Проверяет правильность имени переменной перед ее печатью (например, vared $) Усекает многострочные переменные.
0
ответ дан 22 May 2018 в 15:55

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

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

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

Не будет ошибки, если переменная unset Проверяет правильность имени переменной перед ее печатью (например, vared $) Усекает многострочные переменные.
1
ответ дан 18 July 2018 в 00:24

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

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

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

Не будет ошибки, если переменная unset Проверяет правильность имени переменной перед ее печатью (например, vared $) Усекает многострочные переменные.
0
ответ дан 24 July 2018 в 17:12

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

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