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?
$PS1
mit uns teilen ?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?Antworten:
Wenn deine PS1 ähnlich ist wie:
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:
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
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
am Ende, aber das Skript sollte ausgeführt werden als
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.
quelle
export PS1='[\u@'$(hostname)'\h \W]\$'
Was ist der Sinn von $ (Hostname)? \ h sollte der Kurzname des Hostnamens sein, richtig?export
auß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!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:quelle
hostname newname
und er bleibt im aufrufenden Terminal bestehen, selbst wenn das Skript ausgeführt wird, ohne es zu beziehen. Beim Ausführenexport PS1='`hostname`'
wird die PS1 ordnungsgemäß in den neuen Hostnamen geändert. Wenn ich die\h
zu aktualisierende Variable jedoch nicht erhalten kann, muss der Benutzer die Shell nur beenden.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:
oder
quelle
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?hostname
Auf 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.quelle
bash -i