Bash - PS1 nie aktualizuje się przy użyciu właściwej nazwy hosta po zmianie nazwy hosta w skrypcie


11

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?


Tu nie chodzi o programowanie, więc powinien znajdować się na jednej z innych stron wymiany stosów, nie tutaj. Powinieneś jednak być w stanie go rozwiązać, po prostu zmieniając PS1 na inny ciąg, a następnie ponownie, co spowoduje, że bash ponownie przeczyta nazwę hosta.
Jonathan Wakely

1
Czy zamierzasz podzielić się $PS1z nami swoim prądem ?
Ignacio Vazquez-Abrams

1
Dokładnie: jaka jest zawartość PS1? echo „$ PS1” sb „[\ u @ \ h \ w] \ $”
Bruce

Tak, moje $ PS1 ma \ h i zdarza się, że to dokładnie „[\ u @ \ h \ w] \ $”.
Joseph Glover,

Skopiuj z mojego komentarza poniżej ... Niestety to (. ~ / .Bashrc) nic nie robi. Próbowałem też zrobić 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?
Joseph Glover,

Odpowiedzi:


7

Jeśli twój PS1 jest podobny do:

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

Wartość \ h jest ustawiana tylko podczas uruchamiania bash. Dlatego jeśli zmienisz nazwę hosta, musisz uruchomić nową instancję bash:

exec 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.


1
Jest to więc prawdopodobnie najbliższa moja funkcjonalność bez wychodzenia z terminala. Niestety nadal pozostawia inne wystąpienie bash o jeden poziom wyżej, więc gdy użytkownik wyjdzie, powraca do starej instancji, a tym samym starej nazwy hosta. Ale dziękuję za potwierdzenie, że jest ustawiony tylko podczas uruchamiania! Tak myślałem, ale nie byłem pewien. Czy masz źródło, które możesz wskazać, żebym to potwierdził? Dzięki!
Joseph Glover

6

dwa problemy

PS1 jest ustawiony raz, musisz ponownie ustawić po zmianie nazwy hosta.

Możesz edytować skrypt za pomocą

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

na końcu, ale skrypt powinien być uruchamiany jako

. ./changehost newhostname

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.


Nie rozumiem export PS1='[\u@'$(hostname)'\h \W]\$' Jaki jest sens $ (nazwa hosta)? \ h powinna być krótką nazwą hosta, prawda?
Joseph Glover,

Wydaje mi się też, że wcześniej nie byłem exportpewien , 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!
Joseph Glover,

1

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ń:

PS1="`hostname`'

Tak więc faktycznie zmieniam nazwę hosta, używając hostname newnamei jest ona trwała w terminalu wywołującym, nawet podczas uruchamiania skryptu bez jego pozyskiwania. Uruchomienie export PS1='`hostname`'poprawnie zmienia PS1 na nową nazwę hosta, ale jeśli nie uda mi \hsię zaktualizować zmiennej, po prostu każę użytkownikowi opuścić powłokę.
Joseph Glover,

0

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:

PS1=$PS1

lub

. ~/.bashrc

Niestety to nic nie robi. Próbowałem też zrobić 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?
Joseph Glover,

@JosephGlover Tak, może jest czytany przy uruchomieniu i przechowywany, więc będziesz musiał uruchomić kolejną powłokę, aby go zaktualizować.

0

Możliwe jest ustawienie nazwy hosta systemu bezpośrednio za pomocą hostnamenarzę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.

#!/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

Próbowałem tak, ale wydaje się, że pozyskiwanie nic nie robi.
Joseph Glover,

Czy zmiana pojawia się ponownie po uruchomieniu nowej interaktywnej powłoki? bash -i

Tak, zmiana jest odzwierciedlona.
Joseph Glover,

Spróbuj .bash_profile, a jeśli to nie zadziała, to w zasadzie zasługujesz na wyjaśnienie: większość systemów zacznie od sourcingu / etc / profile we wczesnym czasie wykonywania, a następnie stamtąd pozyska dowolną liczbę innych plików konfiguracyjnych. zwykle kończące się powłoką rc i / lub profilem, aby zakończyć konfigurację użytkownika / domu

Otrzymałem mój plik .bash_profile i nie działa. Znam już także działanie plików rc i profili, ale dziękuję za wyjaśnienie.
Joseph Glover,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.