Это копия моего поста из 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
с нами?export PS1='somestring'; export PS1='[\u@\h \W]\$'
за пределами сценария в терминале, и он переключается на «somestring» и обратно, но имя хоста остается неизменным. : \ Возможно ли, что \ h сохраняется в памяти при запуске процесса и не может быть изменено после запуска?Ответы:
Если ваш PS1 похож на:
Значение \ h устанавливается только при запуске bash. Поэтому, если вы измените имя хоста, вам нужно запустить новый экземпляр bash:
Заменит bash новым экземпляром (с обновленным значением \ h). К сожалению, он выйдет из запущенного скрипта. Некоторое другое волшебство необходимо для внесения изменений в сценарий оболочки, который следует за выполнением кода после изменения имени хоста. Я считаю, что невозможно сохранить один и тот же скрипт с обновленным именем хоста и
\h
. Но я также считаю, что это не то, что вы просите.источник
две проблемы
PS1 устанавливается один раз, вы должны сбросить после изменения имени хоста.
Вы можете редактировать скрипт с
в конце, но скрипт должен быть запущен как
обратите внимание на начальную точку.
Если вы не используете начальную точку, PS1 будет установлен в новой временной оболочке и будет потерян.
Не ясно, если bash обновит значение имени хоста (имя пользователя) (сохраненное в / h, / u) после его запуска, так как эти значения вряд ли изменятся.
Однако Баш заботится о ПУТИ.
источник
export PS1='[\u@'$(hostname)'\h \W]\$'
Какой смысл $ (имя хоста)? \ h должно быть кратким именем хоста, правильно?export
вне сценария, в терминале, где я запускал сценарий, я все еще не получаю обновленную PS1. Заметьте, я могу просто изменить PS1 на что угодно, но просто значение \ h не обновляется!1) вы не меняли имя хоста. Если вы действительно хотите изменить имя хоста, вам нужно позвонить:
uname -S newname
или
hostname newname
в зависимости от используемой вами ОС.
2) Неясно, перечитывает ли bash имя хоста с
\h
. Если вы хотите всегда видеть текущее имя хоста, позвоните:источник
hostname newname
, и оно сохраняется в вызывающем терминале, даже при запуске сценария без его поиска. Запускexport PS1='`hostname`'
правильно меняет PS1 на новое имя хоста, но если я не могу заставить\h
переменную обновляться, я просто заставлю пользователя выйти из оболочки.Похоже, что bash не читает текущее имя хоста при каждом отображении приглашения, поэтому вам нужно будет сказать bash перечитать его. Вы можете попробовать с:
или
источник
export PS1='somestring'; export PS1='[\u@\h \W]\$'
за пределами сценария в терминале, и он переключается на «somestring» и обратно, но имя хоста остается неизменным. : \ Возможно ли, что \ h сохраняется в памяти при запуске процесса и не может быть изменено после запуска?Можно установить системное имя хоста напрямую с помощью
hostname
утилиты во многих операционных системах, однако, если вы решите редактировать файлы вручную, это расширенная версия вашего скрипта. Я добавил тест на наличие пользовательских аргументов, резервных копий для исходных файлов и в конце скрипта получил пользовательский файл .bashrc.источник
bash -i