& ldquo; экспорт PS1 = & rdquo; для настройки приглашения командной строки

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

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

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

После всего тестирования, как мне установить его на значение по умолчанию?

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

1
задан 7 December 2017 в 17:00

3 ответа

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

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

Вот строки, которые устанавливают PS1 в версии по умолчанию [ f15] для моей системы, /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\$ ' вы можете видеть, что escape-коды для username и hostname равны \u и \h соответственно [!d3 ]

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

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

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

Чтобы получить цвета, вам нужно использовать последовательности выделения цвета. Вы можете видеть некоторые в назначении 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="\[\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\]\$ '

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

Вы могли бы сделать то же, но добавьте \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 для цветов и других материалов см. в этом руководстве для настройки приглашения. [ ! d23]

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

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

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

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

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

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

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

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

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

* Я говорю обычно потому что, хотя неинтерактивные оболочки только unset 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, то некоторое значение [ f61], отличное от того, что было в вашей .bashrc, для дочерней оболочки, вы можете сделать это, не допуская, что оболочка из источника .bashrc).

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

3
ответ дан 22 May 2018 в 15:35
  • 1
    Это потрясающе. Я чувствую, что у меня есть Ubuntu. Благодаря :) – Smile 7 December 2017 в 15:17
  • 2
    1; 36, Light Cyan - очень классный материал. – Smile 7 December 2017 в 16:11
  • 3
    Да, я ожидал, что работаю " export VAR = val " приведет к автоматическому изменению моего файла ~ / .profile. Я понимаю ваш ответ частично, но это очень полезно. Благодаря :) – Smile 9 December 2017 в 13:07

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

В интерактивной оболочке нам нужна подсказка, и приятно, если prompt дает нам полезную информацию, такую ​​как текущий рабочий каталог, текущий пользователь и имя хоста, как это делает 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\$ ' вы можете видеть, что escape-коды для username и hostname равны \u и \h соответственно

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

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

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

Чтобы получить цвета, вам нужно использовать последовательности выделения цвета. Вы можете видеть некоторые в назначении 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="\[\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\]\$ '

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

Вы могли бы сделать то же, но добавьте \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 для цветов и других материалов см. в этом руководстве для настройки приглашения. [ ! d23]

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

Наконец, где идет экспортная линия? Я посмотрел в ~/.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 эта оболочка, отредактированное приглашение возвращается)

* Я говорю обычно потому что, хотя неинтерактивные оболочки только unset 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).

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

3
ответ дан 18 July 2018 в 01:39

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

В интерактивной оболочке нам нужна подсказка, и приятно, если prompt дает нам полезную информацию, такую ​​как текущий рабочий каталог, текущий пользователь и имя хоста, как это делает 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\$ ' вы можете видеть, что escape-коды для username и hostname равны \u и \h соответственно

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

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

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

Чтобы получить цвета, вам нужно использовать последовательности выделения цвета. Вы можете видеть некоторые в назначении 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="\[\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\]\$ '

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

Вы могли бы сделать то же, но добавьте \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 для цветов и других материалов см. в этом руководстве для настройки приглашения. [ ! d23]

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

Наконец, где идет экспортная линия? Я посмотрел в ~/.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 эта оболочка, отредактированное приглашение возвращается)

* Я говорю обычно потому что, хотя неинтерактивные оболочки только unset 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).

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

3
ответ дан 24 July 2018 в 17:26

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

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