& ldquo; export PS1 = & rdquo; для настройки командной строки

Я хотел настроить приглашение оболочки, чтобы включить время. Итак, я сделал export PS1='\t\w\.

Моя подсказка теперь выглядит как 18:57:37~$. Я не знаю, как добавить его к username@hostname.

Кроме того, я не знаю, как изменить цвет каждого параметра для \t, \w и так далее.

После всех испытаний, как мне установить значение по умолчанию?

Наконец, куда идет строка экспорта? Я посмотрел в ~/.profile, но нет линии export PS1='\t\w\.

.

.

Моя подсказка теперь выглядит как 18:57:37~$. Я не знаю, как добавить его к username@hostname.

Кроме того, я не знаю, как изменить цвет каждого параметра для \t, \w и так далее.

После всех испытаний, как мне установить значение по умолчанию?

Наконец, куда идет строка экспорта? Я посмотрел в ~/.profile, но нет линии export PS1='\t\w\.

.

3
задан 7 December 2017 в 16:00

1 ответ

PS1 установлен в Вашем ~/.bashrc. Этот файл содержит настройки, которые будут применены в каждой интерактивной оболочке. Интерактивная оболочка Bash - то, что Вы получаете при открытии терминала в Ubuntu если Вы не установили другую оболочку по умолчанию для своего пользователя.

В интерактивной оболочке нам нужна подсказка, и хорошо, если подсказка дает нам некоторую полезную информацию, как текущий рабочий каталог, текущий пользователь и имя хоста, как Ubuntu PS1 делает.

Вот строки, которые устанавливают PS1 в версии по умолчанию .bashrc для моей системы, /etc/skel/.bashrc

# uncomment for a colored prompt, if the terminal has the capability; turned
# off by default to not distract the user: the focus in a terminal window
# should be on the output of commands, not on the prompt
#force_color_prompt=yes

if [ -n "$force_color_prompt" ]; then
    if [ -x /usr/bin/tput ] && tput setaf 1 >&/dev/null; then
        # We have color support; assume it's compliant with Ecma-48
        # (ISO/IEC-6429). (Lack of such support is extremely rare, and such
        # a case would tend to support setf rather than setaf.)
        color_prompt=yes
    else
        color_prompt=
    fi
fi

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
unset color_prompt force_color_prompt

От PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ ' Вы видите что управляющие коды для username и hostname \u и \h соответственно

zanna@toaster:~$ PS1="\u@\h"
zanna@toaster

Если Вы хотите добавить время и текущий рабочий каталог:

zanna@toasterPS1="\u@\h \t \w "
zanna@toaster 10:43:32 ~ 

Для получения цветов необходимо использовать цветные escape-последовательности. Вы видите некоторых в color_prompt присвоении в .bashrc

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

Например, \033[01;34m является синим:

PS1 assignment

Ой! Теперь текст после является синим также..., лучше возвращают его белому:

PS1 with color reassignment

Мы должны окружить цветные присвоения завершенными квадратными скобками, иначе Bash будет думать, что они печатают символы подсказки и используют их для вычисления ее размера. Это дает странные эффекты, когда Вы пытаетесь взаимодействовать со своей историей, таким образом, вот исправленная версия:

PS1="\[\033[01;34m\]\u@\h \t \w \[\033[00m\]"

Когда Вы закончили играть, можно возвратить подсказку для установки по умолчанию путем закрытия терминала и открытия нового ;) или путем выполнения

source ~/.bashrc

my PS1 back to normal

Я установил мой PS1 как это с помощью кода уже в .bashrc, некомментарий #force_color_prompt=yes и изменение цветовых кодов. Здесь Вы видите строки, которые я изменил для установки его:

$ diff .bashrc /etc/skel/.bashrc 
46c46
< force_color_prompt=yes
---
> #force_color_prompt=yes
60c60
<     PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;35m\]\w\$\[\033[00m\] '
---
>     PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '

(существует больше измененных строк после этого но они не релевантны),

Вы могли сделать то же, но добавить a \t в color_prompt выровняйте где-нибудь, например

PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h \[033[01;36m\]\t \[\033[00m\]:\[\033[01;35m\]\w\$\[\033[00m\] '

Для списка управляющих кодов ANSI для цветов и большего количества материала, см. это руководство по настройке подсказки.


Я забыл отвечать на последнюю часть Вашего вопроса.

Наконец, где строка экспорта идет? Я заглянул ~/.profile, но нет экспорта строки PS1='\t\w\$'

Я не уверен, ожидали ли Вы работать export VAR=val вызвал бы Ваш ~/.profile быть автоматически измененным. export команда никогда не делает это. Экспорт переменной только передаст его в среду команд, выполненных от текущей оболочки. Того, когда Вы выходите из оболочки (и все ее дочерние процессы вышли), что-либо, что Вы экспортировали из оболочки, не стало.

Если Вы хотите установить переменную среды постоянно, обычно необходимо добавлять его к ~/.profile явно. Некоторые сценарии, которые Вы могли бы использовать для установки программного обеспечения, могут изменить Ваш ~/.profile или другие конфигурационные файлы оболочки.

Но PS1 не должен быть экспортирован в среду. В начале моего ответа я сказал, что в интерактивной оболочке нам нужна подсказка, и я подразумевал, что только интерактивным оболочкам нужны подсказки (потому что подсказка помогает пользователю взаимодействовать с оболочкой). Никакие другие потребности команды PS1.

Вы могли бы думать, что это могло быть полезно для PS1 быть переданным любым дочерним оболочкам текущей оболочки. Когда Вы запускаете интерактивную оболочку в оболочке путем выполнения bash, новая оболочка не наследует переменные оболочки оболочки вызова; только его переменные среды. Так, для передачи переменных дочерней оболочке мы должны export их.

Но экспорт PS1 будет обычно* не удаваться передать его значение дочерней оболочке, потому что она сбрасывается конфигурационными файлами оболочки, /etc/bash.bashrc и ~/.bashrc. Так, закрытие терминала (поскольку я предложил ранее) не необходимо; даже выполнение bash возвратит Вашу подсказку ее обычной форме:

zanna@toaster:~$ export PS1='\t -> '
22:43:54 -> bash
zanna@toaster:~$ 

(если Вы exit эта оболочка, отредактированная подсказка возвращается),

* я обычно говорю, потому что, хотя неинтерактивные оболочки всегда сбрасывают PS1, интерактивная оболочка Bash сохранит значение PS1 если это установлено. Это не очевидно, потому что как показано в предыдущем примере это обычно сбрасывается конфигурационными файлами. Мы можем раскрыть его путем изменения PS1 и затем запуская новую оболочку, которая не читает наши файлы конфигурации:

zanna@toaster:~$ export PS1='\t -> '
22:55:04 -> bash --norc
22:55:09 -> 

В заключение, существует нет export строка для PS1 в ~/.profile потому что PS1 не переменная среды и имеет не бизнес, являющийся один, так как только интерактивным оболочкам нужен он, и по причине, что интерактивным оболочкам нужно PS1, это установлено в ~/.bashrc, потому что, если не сказали не к, все интерактивные оболочки Bash source ~/.bashrc, так ~/.bashrc не должен export PS1 быть наследованным дочерними оболочками (но если Вы действительно хотите export некоторое значение PS1 кроме того в Вашем .bashrc к дочерней оболочке можно сделать так, препятствуя тому, чтобы та оболочка получила .bashrc).


Я смог расширить свой ответ благодаря Eliah Kagan, который объяснил, как Bash рассматривает PS1 здесь в чате и более подробно в этом ответе.

7
ответ дан 7 December 2017 в 16:00

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

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