2017-10-08 53 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'。 –