
Я не спрашиваю, как изменить имя хоста, и я не спрашиваю, как обновить приглашение терминала. Я спрашиваю, как обновить приглашение терминала из скрипта bash, чтобы при выходе пользователя из скрипта приглашение терминала обновлялось, и пользователю не приходилось бы вызывать source ~/.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
Может быть, невозможно изменить или обновить системную ENV из скрипта bash? Может быть, это невозможно и мне нужно прекратить попытки сделать это? Есть идеи?
решение1
Вы можете использоватьPROMPT_COMMANDпеременная bash для обновления PS1
переменной каждый раз перед отображением приглашения.
Таким образом, вы не распространяете изменения из вашего скрипта обратно в 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
.
Конечно, вы можете обновить имя хоста на основе любого другого файла или команды.