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 зберігається в пам'яті, коли процес починається, і його не можна змінити після запуску?


Мова не йде про програмування, тому має бути на одному з інших сайтів обміну stackexchange, не тут. Однак ви зможете вирішити це, просто змінивши 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 update update (ім'я користувача) (збережене в / 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 та / або профілем, щоб завершити налаштування користувача / дому

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