
No pregunto cómo cambiar un nombre de host ni cómo actualizar un mensaje de terminal. Lo que estoy preguntando es cómo actualizar un indicador de terminal desde un script bash para que cuando el usuario salga del script, el indicador de terminal se actualice y el usuario no tenga que obtener ~/.bashrc desde la línea de comando o reiniciar para recibir el Nuevo mensaje de terminal actualizado. He probado varias cosas con export y source pero nada parece funcionar. Este es mi script simple:
while [[ $newhostname = "" ]]; do
printf "Use of dash \"-\" is allowed\n"
read -p "Enter New Hostname: " newhostname
# Sanitize and un-tint user input
if [[ "$newhostname" =~ ^(([a-zA-Z0-9]|[a-zA-Z0-9][\_a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][\_A-Za-z0-9\-]{0,61}[A-Za-z0-9])$ && $$
printf "\nNew Hostname \"$newhostname\" Passes Format Criteria\n"
hostnamectl set-hostname $newhostname
export HOSTNAME=$newhostname
echo 'PS1='\"\\u@${newhostname}\\w# \" >> ~/.bashrc
source ~/.bashrc
printf "Hostname was updated to \"$newhostname\"\n\n"
export PS1="\u@$HOSTNAME:\w# "
else
printf "\nNew Hostname \"$newhostname\" Does not Pass Format Criteria allowed for DNS domain name labels\n"
printf "http://manpages.ubuntu.com/manpages/bionic/man5/hostname.5.html\n\n"
printf "\033[1;91m ==>> Please Try Again <<==\033[1;33m\n\n"
newhostname=""
fi
done # End While
¿Quizás no sea posible cambiar o actualizar el ENV del sistema desde un script bash? ¿Quizás es imposible y necesito dejar de intentarlo? ¿Algunas ideas?
Respuesta1
Puedes usarPROMPT_COMMANDvariable bash para actualizar la PS1
variable cada vez antes de que se dibuje el mensaje.
De esta manera, no propagará los cambios desde su secuencia de comandos al ENV (lo cual es imposible). En su lugar, está haciendo que bash verifique el nombre de host en cada mensaje que se vuelve a dibujar.
Añade esto a tu ~/.bashrc
:
# set the prompt to whatever you want
# but instead of hostname (\h) use `$dynamic_hostname` variable
PS1='\$ \u@${dynamic_hostname} : \w # '
# prompt command will update the `$dynamic_hostname` variable
# to the latest value before each prompt redraw
PROMPT_COMMAND='dynamic_hostname=$(cat /etc/hostname)'
# this is just to make sure that `$dynamic_hostname` is not unset at any time
realtime_hostname=$(cat /etc/hostname)
El nombre de host que se muestra en el mensaje se actualizará cada vez que se vuelva a dibujar según /etc/hostname
.
Por supuesto, puede actualizar el nombre de host en función de cualquier otro archivo o comando.