「即時」更新終端機提示主機名,無需重新啟動

「即時」更新終端機提示主機名,無需重新啟動

我不是問如何更改主機名,也不是問如何更新終端機提示。我要問的是如何從 bash 腳本更新終端提示符,以便當用戶退出腳本時終端提示符會更新,並且用戶不必從命令列獲取 ~/.bashrc 或重新啟動即可接收新更新的終端提示。我已經嘗試了一些導出和來源的方法,但似乎沒有任何效果。這是我的簡單腳本:

 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

也許無法從 bash 腳本更改或更新系統 ENV?也許這是不可能的,我需要放棄嘗試這樣做?有任何想法嗎?

答案1

您可以使用提示命令PS1bash 變量,以便每次在繪製提示之前更新該變數。

這樣,您就不會將腳本中的變更傳播回 ENV(這是不可能的)。相反,您讓 bash 在每次提示重畫時檢查主機名稱。

將其添加到您的~/.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)

提示中顯示的主機名稱將在每次基於 的重繪時更新/etc/hostname

當然,您可以根據任何其他檔案或命令更新主機名稱。

相關內容