2017-10-08 94 views
1

我有一個bash提示符,其中包含我的主機名,使用\h變量(由PS1解釋)或$(uname -n)。無論我使用哪一個似乎都沒有什麼區別。在Bash PS1提示符下動態更改主機名

對於軟件許可證的原因,有時我不得不改變我的主機名,這是通過調用腳本,更新文件/etc/hosts/etc/hostname完成,並呼籲$ hostname NEWNAME的好辦法。

當腳本更新我的主機名時,我希望調用腳本的shell使其提示符PS1反映更改 - 以顯示新的主機名。我知道這樣做的唯一方法是資助我的.bashrc,其中定義了PS1。但在腳本中調用. "${HOME}/.bashrc"只會修改腳本的環境,而不是調用者的,據我所知。

那麼我怎樣才能讓呼叫者的PS1提示更新以及自動顯示新的主機名?

+1

你是說'\ h'不基於主機名動態地改變? –

+0

改變所有這些應該正確設置,但你總是可以使'PS1'功能。 – tadman

+0

@ IgnacioVazquez - 艾布拉姆斯正確的,直到我推出一個新的外殼(或手動資源'.bashrc')做'\ h'顯示當前的主機名(GNU的bash,版本48年3月4日(1)-release) – ardnew

回答

5
  • 隨着\h

    bash使用內部變量current_host_name。要在啓動時引用它設置它的代碼,只運行一次:

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

    而外殼還初始化shell變量HOSTNAME這個相同的值,它不是一個雙向關係:不能通過修改HOSTNAME更新current_host_name。解決這個問題需要修補外殼。

  • 隨着$(uname -n)

    這是動態更新的只有當你將其分配給PS1當使用單引號。那就是:

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

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

這不會爲每個shell提示實例運行一個「uname」進程嗎? – tadman

+1

是的,它的確如此。可以肯定的是,這很糟糕,效率低下。如果我爲自己做這件事,我至少會*將邏輯移到一個'PROMPT_COMMAND'函數中,並且每隔幾秒鐘最多隻運行'uname'。 –