Atualize o nome do host do prompt do terminal "On The Fly" sem reinicializar

Atualize o nome do host do prompt do terminal "On The Fly" sem reinicializar

Não estou perguntando como alterar um nome de host e não estou perguntando como atualizar um prompt de terminal. O que estou perguntando é como atualizar um prompt de terminal a partir de um script bash para que, quando o usuário sair do script, o prompt do terminal seja atualizado e o usuário não precise obter ~/.bashrc na linha de comando ou reinicializar para receber o novo prompt de terminal atualizado. Eu tentei várias coisas com exportação e origem, mas nada parece funcionar. Este é o meu script simples:

 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

Talvez não seja possível alterar ou atualizar o ENV do sistema a partir de um script bash? Talvez seja impossível e eu precise parar de tentar fazer isso? Alguma ideia?

Responder1

Você pode usarPROMPT_COMMANDvariável bash para atualizar a PS1variável sempre antes do prompt ser desenhado.

Dessa forma, você não está propagando as alterações do seu script de volta para o ENV (o que é impossível). Em vez disso, você está fazendo o bash verificar o nome do host em cada redesenho do prompt.

Adicione isto ao seu ~/.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)

O nome do host exibido no seu prompt será atualizado a cada redesenho baseado em /etc/hostname.

Claro, você pode atualizar o nome do host com base em qualquer outro arquivo ou comando.

informação relacionada