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

标签 bash shell subshell

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

由于软件许可原因,我有时必须更改主机名,这是通过调用更新文件 /etc/hosts/etc/hostname 的脚本来完成的,并且还调用 $ hostname NEWNAME 以达到良好的效果。

当脚本更新我的主机名时,我希望调用该脚本的 shell 使其 PS1 提示符反射(reflect)更改 - 显示新的主机名。我知道做到这一点的唯一方法是通过资源定义 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主机名。解决这个问题需要修补 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)..."
    

关于bash - 在 Bash PS1 提示符中动态更改主机名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46636132/

相关文章:

node.js - 使用 Node.js 从 'named pipe'/fifo 读取

linux - 你用什么命令来预览任何图像

bash: `set -e` 在 if 表达式中使用时不起作用?

bash - 使用管道读取文件,运行脚本并写入同一文件

Bash grep 避免检查目录

linux - 在 unix 中恢复句子中单词的快速方法?

linux - `find` 声称它删除了文件,`ls` 声称它没有

linux - 我可以在 POSIX sh 脚本中避免这个子 shell 吗?

bash - 如何从函数中有效地中止 Bash 脚本的执行

python - 在通过终端打开的程序中输入文本,但速度很快