Bash - PS1 ne se met pas à jour avec un nom d'hôte correct après un changement de nom d'hôte dans le script

11

Ceci est une copie de mon message de stackoverflow; Je réalise que j'aurais dû le demander ici ...

Je veux exécuter un script qui modifie le nom d'hôte et que ma demande bash (variable PS1) soit mise à jour immédiatement avec le nom d'hôte approprié. Comment puis-je y arriver?

Je dirige ça

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

Dans un terminal comme ça et obtenez ceci

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

Mais ce que je veux c'est ça

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

Le terminal n'est correctement mis à jour que lorsque j'ouvre un nouveau shell.

J'ai aussi essayé de faire

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

en dehors du script dans le terminal et il passe à «somestring» et vice-versa, mais le nom d'hôte est inchangé. : \

Est-il possible que le \ h soit stocké en mémoire au début du processus et ne puisse pas être modifié après le démarrage?

Joseph Glover
la source
Il ne s'agit pas de programmation, donc devrait être sur l'un des autres sites stackexchange, pas ici. Cependant, vous devriez être en mesure de le résoudre en changeant simplement PS1 en une autre chaîne, puis de nouveau, ce qui obligera bash à relire le nom d'hôte.
Jonathan Wakely
1
Alliez-vous partager votre courant $PS1avec nous?
Ignacio Vazquez-Abrams
1
Exactement: quel est le contenu de la PS1? echo "$ PS1" sb "[\ u @ \ h \ w] \ $"
Bruce
Oui, ma $ PS1 contient le \ h et se trouve être exactement "[\ u @ \ h \ w] \ $".
Joseph Glover du
Copie de mon commentaire ci-dessous ... Malheureusement (. ~ / .Bashrc) ne fait rien. J'ai également essayé de faire en export PS1='somestring'; export PS1='[\u@\h \W]\$'dehors du script dans le terminal et il passe à «somestring» et vice-versa, mais le nom d'hôte est inchangé. : \ Est-il possible que le \ h soit stocké en mémoire lorsque le processus commence et ne peut pas être modifié après le démarrage?
Joseph Glover du

Réponses:

7

Si votre PS1 est similaire à:

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

La valeur de \ h n'est définie qu'au démarrage de bash. Par conséquent, si vous changez le nom d'hôte, vous devez démarrer une nouvelle instance bash:

exec bash

Remplacera bash par une nouvelle instance (avec la valeur de \ h mise à jour). Malheureusement, il quittera un script en cours d'exécution. Une autre magie est nécessaire pour effectuer la modification d'un script shell qui suit l'exécution du code après la modification du nom d'hôte. Je pense qu'il n'est pas possible de garder le même script en cours d'exécution avec un nom d'hôte et un \h. Mais je pense aussi que ce n'est pas ce que vous demandez.


la source
1
C'est donc probablement le plus proche de mes fonctionnalités sans quitter le terminal. Malheureusement, il laisse encore l'autre instance de bash un niveau plus haut, donc lorsque l'utilisateur quitte, il revient à l'ancienne instance et donc à l'ancien nom d'hôte. Mais merci d'avoir confirmé qu'il n'est défini qu'au démarrage! C'est ce que je pensais, mais je n'étais pas sûr. Avez-vous une source que vous pourriez me signaler pour confirmer cela? Merci!
Joseph Glover du
6

deux problèmes

PS1 est défini une fois, vous devez le réinitialiser une fois le nom d'hôte modifié.

Vous pouvez éditer le script avec

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

à la fin, mais le script doit être exécuté comme

. ./changehost newhostname

notez le premier point.

Si vous n'utilisez pas de point de tête, PS1 sera placé dans un nouveau shell temporaire et sera perdu.


Il n'est pas clair si la valeur de bash update hostname (username) (stockée dans / h, / u) une fois qu'elle est en cours d'exécution car ces valeurs sont peu susceptibles de changer.

Cependant bash s'occupe de PATH.

Archemar
la source
Je ne comprends pas À export PS1='[\u@'$(hostname)'\h \W]\$' quoi sert $ (nom d'hôte)? \ h devrait être le nom abrégé du nom d'hôte, correct?
Joseph Glover
De plus, je suppose que je n'étais pas clair auparavant, mais même en exportdehors du script, dans le terminal sur lequel j'ai exécuté le script, je n'ai toujours pas de PS1 mise à jour. Remarque, je peux très bien changer la PS1 en n'importe quoi, mais simplement la valeur \ h n'est pas mise à jour!
Joseph Glover
1

1) vous n'avez pas modifié le nom d'hôte. Si vous aimez vraiment changer le nom d'hôte, vous devez appeler:

uname -S newname

ou

hostname newname

en fonction du système d'exploitation que vous utilisez.

2) Il n'est pas clair si bash relit le nom d'hôte avec \h. Si vous souhaitez toujours voir le nom d'hôte actuel, appelez:

PS1="`hostname`'
schily
la source
Je change donc le nom d'hôte en utilisant hostname newname, et il est persistant dans le terminal appelant, même lors de l'exécution du script sans le sourcer. L'exécution export PS1='`hostname`'change correctement la PS1 en son nouveau nom d'hôte, mais si je ne parviens pas \hà mettre à jour la variable, je demanderai simplement à l'utilisateur de quitter le shell.
Joseph Glover
0

Il semble que bash ne lit pas le nom d'hôte actuel sur chaque affichage d'invite, vous devrez donc dire à bash de le relire. Vous pouvez essayer avec:

PS1=$PS1

ou

. ~/.bashrc
Alvaro Gutierrez Perez
la source
Malheureusement, cela ne fait rien. J'ai également essayé de faire en export PS1='somestring'; export PS1='[\u@\h \W]\$'dehors du script dans le terminal et il passe à «somestring» et vice-versa, mais le nom d'hôte est inchangé. : \ Est-il possible que le \ h soit stocké en mémoire lorsque le processus commence et ne peut pas être modifié après le démarrage?
Joseph Glover
@JosephGlover Oui, peut-être qu'il est lu au lancement et stocké, vous devrez donc lancer un autre shell pour le mettre à jour.
0

Il est possible de définir le nom d'hôte d'un système directement avec l' hostnameutilitaire sur de nombreux systèmes d'exploitation. Cependant, si vous choisissez de modifier les fichiers à la main, voici une version augmentée de votre script. J'ai ajouté un test pour l'existence d'arguments utilisateur, des sauvegardes pour les fichiers d'origine et j'ai trouvé le .bashrc de l'utilisateur à la fin du script.

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

la source
J'ai essayé comme ça, mais l'approvisionnement ne semble rien faire.
Joseph Glover
Le changement est-il reflété lorsque vous démarrez un nouveau shell interactif? bash -i
Oui, le changement se reflète.
Joseph Glover
Essayez .bash_profile et si cela ne fonctionne pas, vous méritez essentiellement une explication: la plupart des systèmes commenceront par sourcer / etc / profile au début de l'exécution, puis à partir de là, sourcez un certain nombre d'autres fichiers de configuration. se terminant généralement par le shell rc et / ou le profil pour finaliser la configuration de l'utilisateur / home
J'ai trouvé mon fichier .bash_profile et cela ne fonctionne pas. Et je connais également déjà le fonctionnement des fichiers rc et profil, mais merci pour l'explication.
Joseph Glover