2017-10-08 3 views
1

Ich habe eine Bash-Eingabeaufforderung, die meinen Hostnamen mit der \h Variable (interpretiert von PS1) oder $(uname -n) enthält. Was auch immer ich verwende, scheint keinen Unterschied zu machen.Hostname in Bash PS1 Prompt dynamisch ändern

Für Software lizenzrechtlichen Gründen muss ich manchmal meinen Hostnamen ändern, die durch den Aufruf eines Skripts getan wird, die Dateien aktualisiert /etc/hosts und /etc/hostname und fordert auch $ hostname NEWNAME für eine gute Maßnahme.

Wenn das Skript meinen Hostnamen aktualisiert, möchte ich, dass die Shell, die das Skript aufgerufen hat, die PS1 Eingabeaufforderung die Änderung widerspiegelt - um den neuen Hostnamen anzuzeigen. Der einzige Weg, den ich weiß, ist, indem ich meine .bashrc, die PS1 definiert. Aber wenn man . "${HOME}/.bashrc" innerhalb des Skripts aufruft, wird nur die Umgebung dieses Skripts und nicht die des Anrufers geändert, wie ich es verstehe.

Also, wie kann ich die PS1 Eingabeaufforderung des Aufrufers auch aktualisiert, um den neuen Hostnamen automatisch anzuzeigen?

+1

Sie sagen, dass '\ H-nicht dynamisch ändert, basierend auf dem Hostnamen? –

+0

Das Ändern all dieser sollte es richtig einstellen, aber Sie könnten immer 'PS1' eine Funktion machen. – tadman

+0

@ IgnacioVazquez-Abrams richtig, nicht, bis ich eine neue Shell (oder manuell Ressource '.bashrc') starten zeigt' \ h' den aktuellen Hostnamen (GNU Bash, Version 4.3.48 (1) -Release) – ardnew

Antwort

5
  • Mit \h

    Bash verwendet die interne Variable current_host_name. Um den Code zu notieren, die sie setzt, Lauf nur einmal beim Start:

    /* 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); 
        } 
    

    Während die Schale auch die Variable Shell initialisiert HOSTNAME auf diesen gleichen Wert, es ist nicht eine Zwei-Wege-Beziehung: Sie können nicht Aktualisieren Sie current_host_name, indem Sie HOSTNAME ändern. Um dies zu beheben, müsste die Shell gepatcht werden.

  • Mit $(uname -n)

    Dies wird dynamisch aktualisiert nur, wenn Sie einfache Anführungszeichen verwenden, wenn es um PS1 zuweisen. Das heißt:

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

    nicht

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

Führt das nicht für jede Shell-Prompt-Instanz zu einem 'uname'-Prozess? – tadman

+1

Ja, tut es. Es ist schrecklich und ineffizient, um sicher zu sein; wenn ich das für mich selbst machen würde, würde ich * zumindest * die Logik in eine 'PROMPT_COMMAND'-Funktion versetzen und nur so viele Sekunden wie möglich 'uname' ausführen. –