To jest kopia mojego postu z stackoverflow; Zdaję sobie sprawę, że powinienem o to zapytać tutaj ...
Chcę uruchomić skrypt, który zmienia nazwę hosta i natychmiast zaktualizować mój monit bash (zmienna PS1) o prawidłową nazwę hosta. Jak to zrobić?
Prowadzę to
#!/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
W takim terminalu i weź to
[user@host dir]# ./changehost newhostname
[user@host dir]#
Ale chcę tego
[user@host dir]# ./changehost newhostname
[user@newhostname dir]#
Terminal jest odpowiednio aktualizowany tylko wtedy, gdy otworzę nową powłokę.
Próbowałem też to zrobić
export PS1='somestring'; export PS1='[\u@\h \W]\$'
poza skryptem w terminalu i przełącza się na „somestring” iz powrotem, ale nazwa hosta pozostaje niezmieniona. : \
Czy jest możliwe, że \ h jest przechowywany w pamięci na początku procesu i nie można go zmienić po uruchomieniu?
$PS1
z nami swoim prądem ?export PS1='somestring'; export PS1='[\u@\h \W]\$'
poza skryptem w terminalu i przełącza się on na „somestring” iz powrotem, ale nazwa hosta pozostaje niezmieniona. : \ Czy jest możliwe, że \ h jest przechowywany w pamięci na początku procesu i nie można go zmienić po uruchomieniu?Odpowiedzi:
Jeśli twój PS1 jest podobny do:
Wartość \ h jest ustawiana tylko podczas uruchamiania bash. Dlatego jeśli zmienisz nazwę hosta, musisz uruchomić nową instancję bash:
Zastąpi bash nową instancją (ze zaktualizowaną wartością \ h). Niestety zakończy działanie działającego skryptu. Potrzebna jest inna magia, aby zmienić skrypt powłoki, który następuje po wykonaniu kodu po zmianie nazwy hosta. Uważam, że nie można utrzymać tego samego skryptu przy zaktualizowanej nazwie hosta i
\h
. Ale wierzę również, że nie o to prosisz.źródło
dwa problemy
PS1 jest ustawiony raz, musisz ponownie ustawić po zmianie nazwy hosta.
Możesz edytować skrypt za pomocą
na końcu, ale skrypt powinien być uruchamiany jako
zanotuj wiodącą kropkę.
Jeśli nie użyjesz początkowej kropki, PS1 zostanie ustawione w nowej tymczasowej powłoce i zostanie utracone.
Nie jest jasne, czy wartość bash aktualizacji nazwy hosta (nazwa użytkownika) (przechowywana w / h, / u) po uruchomieniu, ponieważ jest mało prawdopodobne, aby te wartości uległy zmianie.
Jednak bash zajmie się PATH.
źródło
export PS1='[\u@'$(hostname)'\h \W]\$'
Jaki jest sens $ (nazwa hosta)? \ h powinna być krótką nazwą hosta, prawda?export
pewien , ale nawet poza skryptem, w terminalu, w którym uruchomiłem skrypt, wciąż nie otrzymuję zaktualizowanego PS1. Uwaga: mogę zmienić PS1 w jakikolwiek sposób, ale po prostu wartość \ h nie jest aktualizowana!1) nie zmieniłeś nazwy hosta. Jeśli naprawdę chcesz zmienić nazwę hosta, musisz zadzwonić:
uname -S newname
lub
hostname newname
w zależności od używanego systemu operacyjnego.
2) Nie jest jasne, czy bash ponownie czyta nazwę hosta
\h
. Jeśli chcesz zawsze widzieć bieżącą nazwę hosta, zadzwoń:źródło
hostname newname
i jest ona trwała w terminalu wywołującym, nawet podczas uruchamiania skryptu bez jego pozyskiwania. Uruchomienieexport PS1='`hostname`'
poprawnie zmienia PS1 na nową nazwę hosta, ale jeśli nie uda mi\h
się zaktualizować zmiennej, po prostu każę użytkownikowi opuścić powłokę.Wygląda na to, że bash nie odczytuje bieżącej nazwy hosta na każdym ekranie zachęty, więc musisz powiedzieć bashowi, aby ją ponownie przeczytał. Możesz spróbować z:
lub
źródło
export PS1='somestring'; export PS1='[\u@\h \W]\$'
poza skryptem w terminalu i przełącza się on na „somestring” iz powrotem, ale nazwa hosta pozostaje niezmieniona. : \ Czy jest możliwe, że \ h jest przechowywany w pamięci na początku procesu i nie można go zmienić po uruchomieniu?Możliwe jest ustawienie nazwy hosta systemu bezpośrednio za pomocą
hostname
narzędzia w wielu systemach operacyjnych, jednak jeśli zdecydujesz się edytować pliki ręcznie, tutaj jest ulepszona wersja skryptu. Dodałem test na istnienie argumentów użytkownika, kopii zapasowych oryginalnych plików i pod koniec skryptu pozyskałem .bashrc użytkownika.źródło
bash -i