我更改了主机名,为什么我的 bash PS1 提示未更改?

Diz*_*ley 23 bash ubuntu hostname

我通过编辑 /etc/hostname 更改了我的主机名,并且可以使用hostname和hostname -F命令查看新的主机名。

但是 shell 提示仍然显示旧的主机名。

顺便说一下,这是 Ubuntu 11.0.4。提示设置在我.bashrc没有编辑的我。注销甚至重新启动都没有效果。

标准 Ubuntu 的相关部分.bashrc:

if [ "$color_prompt" = yes ]; then
    PS1='${debian_chroot:+($debian_chroot)}\[\033[01;32m\]\u@\h\[\033[00m\]:\[\033[01;34m\]\w\[\033[00m\]\$ '
else
    PS1='${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
fi
Run Code Online (Sandbox Code Playgroud)

($debian_chroot 在我登录时未设置...)

我猜主机名是由特殊字符 \h 获取的。

这是 shell 中报告的 PS1 设置:

PS1='\[\e]0;\u@\h: \w\a\]${debian_chroot:+($debian_chroot)}\u@\h:\w\$ '
Run Code Online (Sandbox Code Playgroud)

这是 PS1 显示的内容:

username@oldhostname:~$ 
Run Code Online (Sandbox Code Playgroud)

我使用沃伦回答中的确切命令重复了这个过程。事实证明,主机名在重新启动之前一直有效,但随后它就会丢失,即使/etc/hostname包含新的主机名。

Diz*_*ley 27

根据 Keith 和 Warren 之前的回答以及实际解决方案,我正在回答我自己的问题。感知到的问题是“我更改了主机名,为什么我的 bash PS1 提示未更改?” 实际问题是“为什么我的系统在重新启动时恢复到其旧主机名?”

在这种特殊情况下的答案是:DHCP 配置为覆盖本地设置。

更改主机名的有效方法

以下适用于 Ubuntu,ymmv。

  1. 通过编辑文件更改持久主机名/etc/hostname。

    echo 'mynewhostname' | sudo tee /etc/hostname
    
    Run Code Online (Sandbox Code Playgroud)
  2. 要更改正在运行的系统的主机名,请使用hostname命令。如果没有步骤 1,这将在重新启动时重置。使用您刚刚设置的值是有意义的:

    sudo hostname -F /etc/hostname
    
    Run Code Online (Sandbox Code Playgroud)

    或其等价物:

    sudo hostname `cat /etc/hostname`
    
    Run Code Online (Sandbox Code Playgroud)
  3. 在/etc/hosts.

    摘抄:

    127.0.0.1    mynewhostname.mydomainname.com    mynewhostname
    
    Run Code Online (Sandbox Code Playgroud)
  4. 检查机器是否正在运行 DHCP 客户端。除了 IP 地址之外,DHCP 服务器还可以覆盖主机名和 DNS 解析等设置。“云”托管服务可能会这样做,因此磁盘上的机器映像可以多次重复使用,而无需编辑配置文件。

    如果存在,请编辑 DHCP 客户端配置文件/etc/default/dhcpcd以注释掉该SET_HOSTNAME指令:

    #SET_HOSTNAME='yes'
    
    Run Code Online (Sandbox Code Playgroud)
  5. 如果可能,重新启动系统并检查名称是否已更改:

    hostname
    
    Run Code Online (Sandbox Code Playgroud)

第 4 步对我来说是个新闻,并让我感到意外。我认为在这个答案中记录整个过程会很有用。这一步是由(Linode)我的托管服务的说明提供的,我真的应该正确阅读。


War*_*ung 4

该文件/etc/hostname保存主机名的持久副本,并在启动期间用于设置运行时副本。要更改运行时副本而不重新启动,请说:

$ sudo hostname `cat /etc/hostname`
Run Code Online (Sandbox Code Playgroud)

或者只是将新主机名作为参数传递给命令hostname(1)。