2017-10-08 6 views
1

J'ai une invite bash qui inclut mon nom d'hôte en utilisant la variable \h (interprétée par PS1) ou $(uname -n). Celui que j'utilise ne semble pas faire la différence.Modifier dynamiquement le nom d'hôte dans l'invite Bash PS1

Pour des raisons de licences logicielles, je dois parfois changer mon nom d'hôte, qui se fait en appelant un script qui met à jour les fichiers /etc/hosts et /etc/hostname, et demande également $ hostname NEWNAME pour faire bonne mesure. Lorsque le script met à jour mon nom d'hôte, je voudrais que le shell appelant le script affiche son invite PS1 refléter le changement - pour afficher le nouveau nom d'hôte. La seule façon que je sais de faire ceci est en ressourçant mon .bashrc qui définit PS1. Mais appeler . "${HOME}/.bashrc" dans le script va seulement modifier l'environnement de ce script et pas celui de l'appelant, si je comprends bien.

Alors, comment puis-je obtenir l'invite PS1 de l'appelant pour afficher le nouveau nom d'hôte automatiquement?

+1

Voulez-vous dire que '\ h' ne change pas dynamiquement en fonction du nom d'hôte? –

+0

La modification de tous ceux-ci devrait le régler correctement, mais vous pouvez toujours faire une fonction 'PS1'. – tadman

+0

@ IgnacioVazquez-Abrams correct, pas jusqu'à ce que je lance un nouveau shell (ou manuellement la ressource '.bashrc') ne \ h' montre le nom d'hôte actuel (GNU bash, version 4.3.48 (1) -release) – ardnew

Répondre

5
  • Avec \h

    Bash utilise la variable interne current_host_name. Pour citer le code qui le met, exécuté qu'une seule fois au démarrage:

    /* It's highly unlikely that this will change. */ 
    if (current_host_name == 0) 
        { 
        /* Initialize current_host_name. */ 
        if (gethostname (hostname, 255) < 0) 
         current_host_name = "??host??"; 
        else 
         current_host_name = savestring (hostname); 
        } 
    

    Alors que la coquille initialise la variable shell HOSTNAME à cette même valeur, ce n'est pas une relation à double sens: Vous ne pouvez pas mettez à jour current_host_name en modifiant HOSTNAME. Corriger cela nécessiterait de patcher le shell.

  • Avec $(uname -n)

    C'est mis à jour dynamiquement uniquement si vous utilisez des guillemets simples lors de l'attribution à PS1. C'est:

    # Check uname every time the prompt is rendered 
    PS1='....$(uname -n)...' 
    

    pas

    # Check uname only once, at shell startup 
    PS1="....$(uname -n)..." 
    
+1

Cela ne lance-t-il pas un processus 'uname' pour chaque instance d'invite de shell? – tadman

+1

Oui, c'est le cas. C'est affreux et inefficace, pour être sûr; Si je faisais cela par moi-même, j'allais au moins * déplacer la logique dans une fonction 'PROMPT_COMMAND' et exécuter' uname' seulement toutes les secondes. –