这是我在 stackoverflow 上的帖子的副本;我意识到我应该在这里问它......
我想运行一个脚本来更改主机名,并立即使用正确的主机名更新我的 bash 提示符(PS1 变量)。我该如何做到这一点?
我运行这个
#!/bin/bash
# Usage: ./changehost <newhostname>
#Do two sed's to edit the files for persistent hostname change
sed -i s/$(hostname)/$1/g "/etc/hosts"
sed -i s/$(hostname)/$1/g "/etc/sysconfig/network"
#run the hostname command with new hostname to update it
hostname $1
Run Code Online (Sandbox Code Playgroud)
在这样的终端中得到这个
[user@host dir]# ./changehost newhostname
[user@host dir]#
Run Code Online (Sandbox Code Playgroud)
但我想要的是这个
[user@host dir]# ./changehost newhostname
[user@newhostname dir]#
Run Code Online (Sandbox Code Playgroud)
只有当我打开一个新的 shell 时,终端才会正确更新。
我也尝试过
export PS1='somestring'; export PS1='[\u@\h \W]\$'
Run Code Online (Sandbox Code Playgroud)
在终端中的脚本之外,它确实切换到“somestring”并返回,但主机名未更改。:\
\h 是否有可能在进程开始时存储在内存中并且启动后无法更改?
小智 9
如果您的 PS1 类似于:
export PS1='[\u@\h \W]\$'
Run Code Online (Sandbox Code Playgroud)
\h 的值仅在 bash 启动时设置。因此,如果更改主机名,则需要启动一个新的 bash 实例:
exec bash
Run Code Online (Sandbox Code Playgroud)
将用新实例替换 bash(更新了 \h 的值)。可悲的是,它将退出正在运行的脚本。需要一些其他魔法来更改主机名更改后执行代码后的 shell 脚本。我相信使用更新的主机名和\h. 但我也相信这不是你所要求的。
两个问题
PS1 设置一次,更改主机名后必须重新设置。
您可以编辑脚本
export PS1='[\u@'$(hostname)' \W]\$'
Run Code Online (Sandbox Code Playgroud)
最后,但脚本应该作为
. ./changehost newhostname
Run Code Online (Sandbox Code Playgroud)
注意前导点。
如果不使用前导点,PS1 将被设置在一个新的临时外壳中并丢失。
目前尚不清楚 bash 是否在运行后更新主机名(用户名)值(存储在 /h、/u 中),因为这些值不太可能改变。
但是 bash 会处理 PATH。
没有办法让 Bash 更新被\\h翻译成的值。启动时读取一次,之后不再修改。因此,如果您需要获取更新的提示,唯一的选择是:
bashexec bash\\h为$(hostname)或 文字字符串现在,更多地了解 Bash 内部结构。主机名值保存在current_host_name变量中,该变量在中定义shell.h:113:
extern char *current_host_name;\nRun Code Online (Sandbox Code Playgroud)\n它用在三个地方variables.c:695:
temp_var = set_if_not ("HOSTNAME", current_host_name);\nRun Code Online (Sandbox Code Playgroud)\nparse.y:6039:
case \'h\':\ncase \'H\':\n t_host = savestring (current_host_name);\n if (c == \'h\' && (t = (char *)strchr (t_host, \'.\')))\n...\nRun Code Online (Sandbox Code Playgroud)\n和y.tab.c:8333:
case \'h\':\ncase \'H\':\n t_host = savestring (current_host_name);\n if (c == \'h\' && (t = (char *)strchr (t_host, \'.\')))\n...\nRun Code Online (Sandbox Code Playgroud)\nshell_initialize()并且在以下函数中仅为其赋值一次(除了用空字符串初始化之外)shell.c:1918:
/* It\'s highly unlikely that this will change. */\nif (current_host_name == 0)\n {\n /* Initialize current_host_name. */\n if (gethostname (hostname, 255) < 0)\n current_host_name = "??host??";\n else\n current_host_name = savestring (hostname);\n }\nRun Code Online (Sandbox Code Playgroud)\n所有行号和文件名均来自bash-5.1.tar.gzkernel.org镜像的源代码。
| 归档时间: |
|
| 查看次数: |
16833 次 |
| 最近记录: |