Bash - PS1 не обновляется с правильным именем хоста после изменения имени хоста в скрипте


11

Это копия моего поста из stackoverflow; Я понимаю, что должен был спросить это здесь ...

Я хочу запустить скрипт, который меняет имя хоста и немедленно обновляет приглашение bash (переменная PS1) с правильным именем хоста. Как мне это сделать?

Я бегу это

#!/bin/bash
# Usage: ./changehost <newhostname>

#Do two sed's to edit the files for persistent hostname change
sed -i s/$(hostname)/$1/g "/etc/hosts"
sed -i s/$(hostname)/$1/g "/etc/sysconfig/network"

#run the hostname command with new hostname to update it
hostname $1

В терминале вроде так и получается

[user@host dir]# ./changehost newhostname
[user@host dir]# 

Но то, что я хочу, это

[user@host dir]# ./changehost newhostname
[user@newhostname dir]# 

Терминал обновляется корректно только тогда, когда я открываю новую оболочку.

Я также пытался сделать

export PS1='somestring'; export PS1='[\u@\h \W]\$' 

вне сценария в терминале, и он переключается на «somestring» и обратно, но имя хоста не изменяется. : \

Возможно ли, что \ h сохраняется в памяти при запуске процесса и не может быть изменено после запуска?


Это не о программировании, поэтому должно быть на одном из других сайтов обмена стека, а не здесь. Тем не менее, вы должны быть в состоянии решить эту проблему, просто изменив PS1 на другую строку, а затем вернитесь обратно, что заставит bash перечитать имя хоста.
Джонатан Уэйкли

1
Собираетесь ли вы поделиться своим текущим $PS1с нами?
Игнасио Васкес-Абрамс

1
Точно: каково содержание PS1? echo "$ PS1" sb "[\ u @ \ h \ w] \ $"
Брюс

Да, в моем $ PS1 есть \ h, и он точно равен "[\ u @ \ h \ w] \ $".
Джозеф Гловер

Скопируйте из моего комментария ниже ... К сожалению, это (. ~ / .Bashrc) ничего не делает. Я также попытался выполнить export PS1='somestring'; export PS1='[\u@\h \W]\$'за пределами сценария в терминале, и он переключается на «somestring» и обратно, но имя хоста остается неизменным. : \ Возможно ли, что \ h сохраняется в памяти при запуске процесса и не может быть изменено после запуска?
Джозеф Гловер

Ответы:


7

Если ваш PS1 похож на:

export PS1='[\u@\h \W]\$'

Значение \ h устанавливается только при запуске bash. Поэтому, если вы измените имя хоста, вам нужно запустить новый экземпляр bash:

exec bash

Заменит bash новым экземпляром (с обновленным значением \ h). К сожалению, он выйдет из запущенного скрипта. Некоторое другое волшебство необходимо для внесения изменений в сценарий оболочки, который следует за выполнением кода после изменения имени хоста. Я считаю, что невозможно сохранить один и тот же скрипт с обновленным именем хоста и \h. Но я также считаю, что это не то, что вы просите.


1
Так что это, вероятно, ближе всего к моей функциональности, не выходя из терминала. К сожалению, он все еще оставляет другой экземпляр bash на один уровень выше, поэтому, когда пользователь выходит, он возвращается к старому экземпляру и, следовательно, старому имени хоста. Но спасибо за подтверждение, что он установлен только при запуске! Это то, о чем я думал, но я не был уверен. У вас есть источник, на который вы могли бы указать мне, чтобы подтвердить это? Благодарность!
Джозеф Гловер

6

две проблемы

PS1 устанавливается один раз, вы должны сбросить после изменения имени хоста.

Вы можете редактировать скрипт с

export PS1='[\u@'$(hostname)' \W]\$' 

в конце, но скрипт должен быть запущен как

. ./changehost newhostname

обратите внимание на начальную точку.

Если вы не используете начальную точку, PS1 будет установлен в новой временной оболочке и будет потерян.


Не ясно, если bash обновит значение имени хоста (имя пользователя) (сохраненное в / h, / u) после его запуска, так как эти значения вряд ли изменятся.

Однако Баш заботится о ПУТИ.


Я не понимаю export PS1='[\u@'$(hostname)'\h \W]\$' Какой смысл $ (имя хоста)? \ h должно быть кратким именем хоста, правильно?
Джозеф Гловер

Кроме того, я думаю, что я не был понятен раньше, но даже если я выполняю exportвне сценария, в терминале, где я запускал сценарий, я все еще не получаю обновленную PS1. Заметьте, я могу просто изменить PS1 на что угодно, но просто значение \ h не обновляется!
Джозеф Гловер

1

1) вы не меняли имя хоста. Если вы действительно хотите изменить имя хоста, вам нужно позвонить:

uname -S newname

или

hostname newname

в зависимости от используемой вами ОС.

2) Неясно, перечитывает ли bash имя хоста с \h. Если вы хотите всегда видеть текущее имя хоста, позвоните:

PS1="`hostname`'

Таким образом, я на самом деле меняю имя хоста, используя его hostname newname, и оно сохраняется в вызывающем терминале, даже при запуске сценария без его поиска. Запуск export PS1='`hostname`'правильно меняет PS1 на новое имя хоста, но если я не могу заставить \hпеременную обновляться, я просто заставлю пользователя выйти из оболочки.
Джозеф Гловер

0

Похоже, что bash не читает текущее имя хоста при каждом отображении приглашения, поэтому вам нужно будет сказать bash перечитать его. Вы можете попробовать с:

PS1=$PS1

или

. ~/.bashrc

К сожалению, это ничего не делает. Я также попытался выполнить export PS1='somestring'; export PS1='[\u@\h \W]\$'за пределами сценария в терминале, и он переключается на «somestring» и обратно, но имя хоста остается неизменным. : \ Возможно ли, что \ h сохраняется в памяти при запуске процесса и не может быть изменено после запуска?
Джозеф Гловер

@JosephGlover Да, возможно, он читается при запуске и сохраняется, поэтому вам потребуется запустить другую оболочку, чтобы обновить его.

0

Можно установить системное имя хоста напрямую с помощью hostnameутилиты во многих операционных системах, однако, если вы решите редактировать файлы вручную, это расширенная версия вашего скрипта. Я добавил тест на наличие пользовательских аргументов, резервных копий для исходных файлов и в конце скрипта получил пользовательский файл .bashrc.

#!/bin/bash 

# Error if anything goes wrong and report all commands
set -xe

# Test that the user supplied an argument
if [[ "$#" != 1 ]]
then printf "Usage: $0 <newhostname>\n"
     exit 1
fi

# Back up the files first (but don't clobber old backups).
cp -n /etc/hosts /etc/hosts.bak
cp -n /etc/sysconfig/network /etc/sysconfig/network.bak


# Do two seds to edit the files for persistent hostname change:
sed -i "s/$(hostname)/$1/g" /etc/hosts
sed -i "s/$(hostname)/$1/g" /etc/sysconfig/network

# Source the user's .bashrc file
. /home/$USER/.bashrc

Я пытался так, но поиск источников ничего не дает.
Джозеф Гловер

Отражены ли изменения при запуске новой интерактивной оболочки? bash -i

Да, изменения отражены.
Джозеф Гловер

Попробуйте .bash_profile, и если это не сработает, то, по сути, вы заслуживаете объяснения: большинство систем начнут с поиска / etc / profile в начале работы, а затем оттуда получат любое количество других файлов конфигурации. обычно заканчивая оболочкой rc и / или профилем, чтобы завершить настройку пользователя / home

Я получил мой файл .bash_profile, и он не работает. И я также уже знаком с тем, как работают файлы rc и profile, но спасибо за объяснение.
Джозеф Гловер
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.