Aktualisieren Sie den Hostnamen der Terminal-Eingabeaufforderung „on the fly“ ohne Neustart

Aktualisieren Sie den Hostnamen der Terminal-Eingabeaufforderung „on the fly“ ohne Neustart

Ich frage nicht, wie man einen Hostnamen ändert, und ich frage nicht, wie man eine Terminal-Eingabeaufforderung aktualisiert. Ich frage, wie man eine Terminal-Eingabeaufforderung von einem Bash-Skript aus aktualisiert, sodass die Terminal-Eingabeaufforderung aktualisiert wird, wenn der Benutzer das Skript beendet, und der Benutzer nicht ~/.bashrc von der Befehlszeile aus aufrufen oder neu starten muss, um die neue aktualisierte Terminal-Eingabeaufforderung zu erhalten. Ich habe verschiedene Dinge mit Export und Quelle probiert, aber nichts scheint zu funktionieren. Dies ist mein einfaches Skript:

 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

Vielleicht ist es nicht möglich, die System-Umgebung über ein Bash-Skript zu ändern oder zu aktualisieren? Vielleicht ist es unmöglich und ich muss aufhören, es zu versuchen? Irgendwelche Ideen?

Antwort1

Sie könnenPROMPT_COMMANDBash-Variable, um die PS1Variable jedes Mal zu aktualisieren, bevor die Eingabeaufforderung gezeichnet wird.

Auf diese Weise übertragen Sie die Änderungen aus Ihrem Skript nicht zurück in die ENV (was unmöglich ist). Stattdessen veranlassen Sie Bash, den Hostnamen bei jedem Neuzeichnen der Eingabeaufforderung zu überprüfen.

Fügen Sie dies zu Ihrem hinzu ~/.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)

Der in Ihrer Eingabeaufforderung angezeigte Hostname wird bei jedem Neuzeichnen basierend auf aktualisiert /etc/hostname.

Natürlich können Sie den Hostnamen basierend auf jeder anderen Datei oder jedem anderen Befehl aktualisieren.

verwandte Informationen