¿Qué hace "$ {debian_chroot: + ($ debian_chroot)}" en mi indicador de terminal?

87

En mi definición de terminal en mi .bashrcarchivo, entre otras cosas, tengo este fragmento de código:

${debian_chroot:+($debian_chroot)}

¿Qué hace esto y lo necesito?

fouric
fuente

Respuestas:

83

La parte importante para responder esta pregunta es este fragmento de /etc/bash.bashrc:

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

Significa que si la variable $debian_chrootestá vacía y el archivo /etc/debian_chrootexiste y es legible, la variable se establece en el contenido del archivo.

¿Para qué es esto? El archivo /etc/debian_chrootes cuando tiene un sistema debian chrooteado dentro de otro sistema debian (ubuntu se basa en debian). Entonces esto es para una mejor visión general. Para distinguir si estás en el chroot o no.

Cuando tiene un chroot de otro sistema, por ejemplo /srv/nfs4/netboot/, puede establecer un nombre para este chroot en /srv/nfs4/netboot/etc/debian_chroot(en mi caso, es una unidad de arranque nfs4 pxe netboot):

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

Y luego cuando haces chroot por dentro:

chroot /srv/nfs4/netboot/

Su mensaje se ve así:

(netboot)user@host:~#
caos
fuente
55

En general, ${var:+value}significa:

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

La debian_chrootvariable se define en el /etc/bash.bashrcarchivo. Toma el contenido del /etc/debian_chrootarchivo si este archivo existe y es legible. Por defecto este archivo no existe.

Para más detalles, ver:

Ahora, para comprender mejor qué está sucediendo exactamente allí, haga lo siguiente en la terminal:

radu@Radu:~$PS1 = '$ {var: + ($ var)} \ u @ \ h: \ w \ $'
 radu @ Radu: ~ $ var = "prueba"='${var:+($var)}\u@\h:\w\$ '
:~$="test"
                  --------
                   El ||
  ------------------------------------
  El ||
  V
(prueba) radu @ Radu: ~ $test)radu@Radu:~$ var = ""
 radu @ Radu: ~ $ var = "y así sucesivamente"
 (y así sucesivamente) radu @ Radu: ~ $=""
:~$="and so on"
and so on)radu@Radu:~$
Radu Rădeanu
fuente
19

Si la variable de entorno $debian_chrootexiste y no está vacía, ${debian_chroot:+($debian_chroot)}se reemplaza por ($debian_chroot)(ese es el valor $debian_chrootcon parens a su alrededor).

$debian_chrootse establece en /etc/bash.bashrcel contenido de /etc/debian_chrootsi ese archivo existe (no existe de manera predeterminada) y $debian_chrootaún no tiene un valor.

${debian_chroot:+($debian_chroot)} se usa generalmente para definir su solicitud de Bash, por ejemplo

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

Como su nombre lo indica, puede usar esta variable para indicar en qué chroot se encuentra colocándolo etc/debian_chrooten sus carpetas raíz de chroot.

Si no sabe qué es un chroot, es probable que no lo necesite ;-) Pero aún puede abusar de él para incluir otra información en su mensaje Bash

Por defecto no hace nada.

Florian Diesch
fuente
0

Si nunca necesita usarlo, debian_chrootentonces es un lugar útil para poner la hora en que se mostró el símbolo del sistema usando:

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

Escriba esto en su terminal y observe cómo cambia el símbolo del sistema con la hora:

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

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

Una vez que se establece el tiempo una vez, para obtener un reloj en funcionamiento que se actualiza cada segundo uso:

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