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

Dynamically change hostname in Bash PS1 prompt

我有一个 bash 提示,其中包括使用 \h 变量(由 PS1 解释)或 $(uname -n) 的主机名。无论我使用哪个似乎都没有什么不同。

出于软件许可的原因,有时我不得不更改我的主机名,这是通过调用更新文件 /etc/hosts/etc/hostname 的脚本来完成的,并且还会永久调用 $ hostname NEWNAME措施。

当脚本更新我的主机名时,我希望调用脚本的 shell 的 PS1 提示反映更改——以显示新的主机名。我知道做到这一点的唯一方法是为定义 PS1.bashrc 提供资源。但是在脚本中调用 . "${HOME}/.bashrc" 只会修改脚本的环境,而不是调用者的环境,据我所知。

那么我怎样才能使呼叫者的 PS1 提示更新并自动显示新的主机名?

  • \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 也将 shell 变量 HOSTNAME 初始化为相同的值,但这不是双向关系:您不能更新 current_host_name修改 HOSTNAME。解决这个问题需要修补 shell.

  • $(uname -n)

    仅当您在将其分配给 PS1 时使用单引号时,才会动态更新 。即:

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

    不是

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