Я хотел настроить приглашение оболочки, чтобы включить время. Итак, я сделал 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\.
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
является синим:
Ой! Теперь текст после является синим также..., лучше возвращают его белому:
Мы должны окружить цветные присвоения завершенными квадратными скобками, иначе Bash будет думать, что они печатают символы подсказки и используют их для вычисления ее размера. Это дает странные эффекты, когда Вы пытаетесь взаимодействовать со своей историей, таким образом, вот исправленная версия:
PS1="\[\033[01;34m\]\u@\h \t \w \[\033[00m\]"
Когда Вы закончили играть, можно возвратить подсказку для установки по умолчанию путем закрытия терминала и открытия нового ;) или путем выполнения
source ~/.bashrc
Я установил мой 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 здесь в чате и более подробно в этом ответе.