在Bash PS1提示符中动态更改主机名

ard*_*new 2 bash shell subshell

我有一个bash提示符,包含我的主机名使用\h变量(解释PS1)或$(uname -n).无论我使用哪一个似乎没有什么区别.

对于软件许可证的原因,有时我不得不改变我的主机名,这是通过调用脚本,更新文件来完成/etc/hosts/etc/hostname,并呼吁$ hostname NEWNAME良好的措施.

当脚本更新我的主机名时,我希望调用脚本的shell有PS1提示反映更改 - 显示新的主机名.我知道这样做的唯一方法是通过资源我的.bashrc定义PS1.但是. "${HOME}/.bashrc"根据我的理解,在脚本中调用只会修改脚本的环境而不是调用者的环境.

那么如何才能PS1更新调用者的提示符以自动显示新的主机名?

Cha*_*ffy 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);
      }
    
    Run Code Online (Sandbox Code Playgroud)

    虽然shell也将shell变量初始化为HOSTNAME相同的值,但它不是双向关系:您无法current_host_name通过修改来更新HOSTNAME.修复此问题需要修补shell.

  • $(uname -n)

    仅当您在分配时使用单引号时,才会PS1动态更新.那是:

    # Check uname every time the prompt is rendered
    PS1='....$(uname -n)...'
    
    Run Code Online (Sandbox Code Playgroud)

    # Check uname only once, at shell startup
    PS1="....$(uname -n)..."
    
    Run Code Online (Sandbox Code Playgroud)

  • 这不是为每个 shell 提示实例运行一个 `uname` 进程吗? (2认同)