Bash - PS1 wird nach Änderung des Hostnamens im Skript nicht mit dem richtigen Hostnamen aktualisiert

11

Dies ist eine Kopie meines Beitrags von stackoverflow; Mir ist klar, ich hätte es hier fragen sollen ...

Ich möchte ein Skript ausführen, das den Hostnamen ändert, und meine Bash-Eingabeaufforderung (PS1-Variable) sofort mit dem richtigen Hostnamen aktualisieren. Wie mache ich das möglich?

Ich leite das

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

In einem Terminal wie so und hol dir das

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

Aber was ich will ist das

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

Das Terminal wird nur dann ordnungsgemäß aktualisiert, wenn ich eine neue Shell öffne.

Ich habe es auch versucht

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

außerhalb des Skripts im Terminal und es wechselt zu 'somestring' und zurück, aber der Hostname bleibt unverändert. : \

Ist es möglich, dass \ h zu Beginn des Prozesses im Speicher gespeichert wird und nach dem Start nicht mehr geändert werden kann?

Joseph Glover
quelle
Hier geht es nicht um Programmierung, sondern sollte sich auf einer der anderen Stackexchange-Sites befinden, nicht hier. Sie sollten jedoch in der Lage sein, das Problem zu lösen, indem Sie PS1 einfach in eine andere Zeichenfolge ändern und dann wieder zurück, wodurch bash den Hostnamen erneut liest.
Jonathan Wakely
1
Wollten Sie Ihren aktuellen Stand $PS1mit uns teilen ?
Ignacio Vazquez-Abrams
1
Genau: Was ist der Inhalt von PS1? Echo "$ PS1" sb "[\ u @ \ h \ w] \ $"
Bruce
Ja, meine $ PS1 enthält das \ h und ist genau "[\ u @ \ h \ w] \ $".
Joseph Glover
Kopie von meinem Kommentar unten ... Leider macht dies (. ~ / .Bashrc) nichts. Ich habe auch versucht, dies export PS1='somestring'; export PS1='[\u@\h \W]\$'außerhalb des Skripts im Terminal zu tun, und es wechselt zu "Somestring" und zurück, aber der Hostname bleibt unverändert. : \ Ist es möglich, dass das \ h zu Beginn des Prozesses im Speicher gespeichert wird und nach dem Start nicht mehr geändert werden kann?
Joseph Glover

Antworten:

7

Wenn deine PS1 ähnlich ist wie:

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

Der Wert von \ h wird nur beim Start der Bash festgelegt. Wenn Sie den Hostnamen ändern, müssen Sie daher eine neue Bash-Instanz starten:

exec bash

Ersetzt bash durch eine neue Instanz (mit dem Wert \ h aktualisiert). Leider wird ein laufendes Skript beendet. Eine andere Magie ist erforderlich, um die Änderung für ein Shell-Skript vorzunehmen, das nach der Änderung des Hostnamens dem Ausführen von Code folgt. Ich glaube, dass es nicht möglich ist, dasselbe Skript mit einem aktualisierten Hostnamen und auszuführen \h. Aber ich glaube auch, dass Sie nicht darum bitten.


quelle
1
Dies ist wahrscheinlich der nächste Schritt, den ich zu meiner Funktionalität machen kann, ohne das Terminal zu verlassen. Leider bleibt die andere Instanz von Bash immer noch eine Ebene höher. Wenn der Benutzer das Programm beendet, kehrt er zur alten Instanz und damit zum alten Hostnamen zurück. Aber danke für die Bestätigung, dass es nur beim Start eingestellt ist! Das habe ich mir gedacht, aber ich war mir nicht sicher. Haben Sie eine Quelle, auf die Sie mich verweisen könnten, um dies zu bestätigen? Vielen Dank!
Joseph Glover
6

zwei Probleme

PS1 wird einmal eingestellt, Sie müssen neu eingestellt werden, sobald der Hostname geändert wird.

Sie können das Skript mit bearbeiten

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

am Ende, aber das Skript sollte ausgeführt werden als

. ./changehost newhostname

Beachten Sie den führenden Punkt.

Wenn Sie keinen führenden Punkt verwenden, wird PS1 in eine neue temporäre Shell gesetzt und geht verloren.


Es ist nicht klar, ob der Wert für den Bash-Update-Hostnamen (Benutzername) (gespeichert in / h, / u) nach der Ausführung liegt, da sich dieser Wert wahrscheinlich nicht ändert.

Bash kümmert sich jedoch um PATH.

Archemar
quelle
Ich verstehe nicht export PS1='[\u@'$(hostname)'\h \W]\$' Was ist der Sinn von $ (Hostname)? \ h sollte der Kurzname des Hostnamens sein, richtig?
Joseph Glover
Ich glaube, ich war vorher nicht klar, aber selbst exportaußerhalb des Skripts bekomme ich in dem Terminal, in dem ich das Skript ausgeführt habe, immer noch keine aktualisierte PS1. Beachten Sie, dass ich die PS1 problemlos ändern kann, aber der Wert \ h wird einfach nicht aktualisiert!
Joseph Glover
1

1) Sie haben den Hostnamen nicht geändert. Wenn Sie den Hostnamen wirklich ändern möchten, müssen Sie Folgendes aufrufen:

uname -S newname

oder

hostname newname

Abhängig vom verwendeten Betriebssystem.

2) Es ist unklar, ob bash den Hostnamen mit erneut liest \h. Wenn Sie immer den aktuellen Hostnamen sehen möchten, rufen Sie an:

PS1="`hostname`'
schily
quelle
Ich ändere also tatsächlich den Hostnamen mit hostname newnameund er bleibt im aufrufenden Terminal bestehen, selbst wenn das Skript ausgeführt wird, ohne es zu beziehen. Beim Ausführen export PS1='`hostname`'wird die PS1 ordnungsgemäß in den neuen Hostnamen geändert. Wenn ich die \hzu aktualisierende Variable jedoch nicht erhalten kann, muss der Benutzer die Shell nur beenden.
Joseph Glover
0

Es sieht so aus, als würde bash nicht bei jeder Eingabeaufforderung den aktuellen Hostnamen lesen. Sie müssten bash also anweisen, ihn erneut zu lesen. Sie können versuchen mit:

PS1=$PS1

oder

. ~/.bashrc
Alvaro Gutierrez Perez
quelle
Leider macht das nichts. Ich habe auch versucht, dies export PS1='somestring'; export PS1='[\u@\h \W]\$'außerhalb des Skripts im Terminal zu tun, und es wechselt zu "Somestring" und zurück, aber der Hostname bleibt unverändert. : \ Ist es möglich, dass das \ h zu Beginn des Prozesses im Speicher gespeichert wird und nach dem Start nicht mehr geändert werden kann?
Joseph Glover
@JosephGlover Ja, möglicherweise wird es beim Start gelesen und gespeichert, sodass Sie eine andere Shell starten müssen, um es zu aktualisieren.
0

hostnameAuf vielen Betriebssystemen ist es möglich, den Hostnamen eines Systems direkt mit dem Dienstprogramm festzulegen. Wenn Sie die Dateien jedoch manuell bearbeiten möchten, finden Sie hier eine erweiterte Version Ihres Skripts. Ich habe einen Test für das Vorhandensein von Benutzerargumenten und Sicherungen für die Originaldateien hinzugefügt und die .bashrc des Benutzers am Ende des Skripts bezogen.

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

quelle
Ich habe es so versucht, aber Sourcing scheint nichts zu bewirken.
Joseph Glover
Wird die Änderung beim Starten einer neuen interaktiven Shell berücksichtigt? bash -i
Ja, die Änderung wird wiedergegeben.
Joseph Glover
Versuchen Sie es mit .bash_profile. Wenn dies nicht funktioniert, verdienen Sie im Wesentlichen eine Erklärung: Die meisten Systeme beginnen mit der Beschaffung von / etc / profile zur frühen Laufzeit und beziehen dann eine beliebige Anzahl anderer Konfigurationsdateien von dort. Im Allgemeinen endet mit der Shell RC und / oder Profil, um die Einrichtung des Benutzers / Home
Ich habe meine .bash_profile-Datei bezogen und sie funktioniert nicht. Und ich bin auch schon mit der Funktionsweise der RC- und Profildateien vertraut, aber ich danke Ihnen für die Erklärung.
Joseph Glover