Что делает «${debian_chroot:+($debian_chroot)}» в командной строке терминала?

Что делает «${debian_chroot:+($debian_chroot)}» в командной строке терминала?

В определении приглашения терминала в моем .bashrcфайле, среди прочего, есть следующий фрагмент кода:

${debian_chroot:+($debian_chroot)}

Что это дает и нужно ли мне это?

решение1

Важная часть для ответа на этот вопрос — этот фрагмент из /etc/bash.bashrc:

if [ -z "$debian_chroot" ] && [ -r /etc/debian_chroot ]; then
    debian_chroot=$(cat /etc/debian_chroot)
fi

Это означает, что если переменная $debian_chrootпуста, а файл /etc/debian_chrootсуществует и доступен для чтения, то переменной присваивается содержимое файла.

Теперь, для чего это? Файл /etc/debian_chrootнужен, когда у вас chroot-система Debian внутри другой системы Debian (Ubuntu основан на Debian). Так что это для лучшего обзора. Чтобы отличить, находитесь ли вы в chroot-системе или нет.

Например, если у вас есть chroot другой системы, /srv/nfs4/netboot/вы можете задать имя для этого chroot /srv/nfs4/netboot/etc/debian_chroot(в моем случае это загрузочный диск nfs4 pxe):

user@host:~# echo "netboot" >/srv/nfs4/netboot/etc/debian_chroot

А затем, когда вы делаете chroot внутри:

chroot /srv/nfs4/netboot/

Ваша подсказка выглядит так:

(netboot)user@host:~#

решение2

В общем случае ${var:+value}это означает:

if $var is defined and not null; then use 'value'; else do nothing

Переменная debian_chrootопределена в /etc/bash.bashrcфайле. Она принимает содержимое /etc/debian_chrootфайла, если этот файл существует и доступен для чтения. По умолчанию этот файл не существует.

Более подробную информацию см. здесь:

Теперь, чтобы лучше понять, что именно там происходит, сделайте в терминале следующее:

radu@Radu:~$PS1='${var:+($var)}\u@\h:\w\$ '
radu@Radu:~$вар="тест"
                  ----
                   |
  ------------------
  |
  В
(тест)radu@Radu:~$вар=""
radu@Radu:~$var="и так далее"
(и так далее)radu@Radu:~$

решение3

Если переменная окружения $debian_chrootсуществует и не является пустой, ${debian_chroot:+($debian_chroot)}она заменяется на ($debian_chroot)(то есть на значение $debian_chrootв скобках).

$debian_chrootустанавливается /etc/bash.bashrcв содержимое, /etc/debian_chrootесли этот файл существует (по умолчанию его нет) и $debian_chrootпока не имеет значения.

${debian_chroot:+($debian_chroot)}обычно используется для определения приглашения Bash, например

PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '

Как следует из названия, вы можете использовать эту переменную для указания того, в какой среде chroot вы находитесь, поместив ее etc/debian_chrootв корневые папки chroot.

Если вы не знаете, что такое chroot, скорее всего, он вам не нужен ;-) Но вы все равно можете злоупотребить им, чтобы включить какую-то другую информацию в приглашение Bash.

По умолчанию он ничего не делает.

решение4

Если вам никогда не понадобится использовать эту функцию debian_chroot, то это удобное место, где можно указать время отображения командной строки, используя:

export PROMPT_COMMAND='debian_chroot=$(date +%r)'

Введите это в терминале и наблюдайте, как командная строка меняется со временем:

rick@alien:~$ export PROMPT_COMMAND='debian_chroot=$(date +%r)'

(09:14:59 PM)rick@alien:~$ 

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

while sleep 1;do tput sc;tput cup $(($(tput lines)-1)) 1;printf `date +%r`;tput rc;done &

Связанный контент