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?
$PS1
avec nous?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?Réponses:
Si votre PS1 est similaire à:
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:
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
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
à la fin, mais le script doit être exécuté comme
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.
la source
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?export
dehors 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!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:la source
hostname newname
, et il est persistant dans le terminal appelant, même lors de l'exécution du script sans le sourcer. L'exécutionexport 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.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:
ou
la source
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?Il est possible de définir le nom d'hôte d'un système directement avec l'
hostname
utilitaire 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.la source
bash -i