动态添加 /etc/hosts 问题

发布于 2022-08-29 22:42:20 字数 715 浏览 21 评论 0

正确的版本:

HOSTNAME=`hostname`
ip_addr=`/sbin/ifconfig bond0 |grep -a "inet addr:" |awk -F":" '{print $2}' |egrep -o '([0-9]{1,3}\.?){4}'`
echo ${ip_addr} > temp.txt
sudo sh -c 'echo "`cat temp.txt` ${HOSTNAME}" >> /etc/hosts'

有问题的版本:

#!/bin/bash
HOSTNAME=`hostname`
ip_addr=`/sbin/ifconfig bond0 |grep -a "inet addr:" |awk -F":" '{print $2}' |egrep -o '([0-9]{1,3}\.?){4}'`
sudo sh -c 'echo "${ip_addr} ${HOSTNAME}" >> /etc/hosts'

为什么有问题的版本添加 /etc/hosts 最后,在 /etc/hosts 文件中只有主机名,ip_addr 被一个空格代替,而第一个就可以?

有问题的输出是:

  test.test.com

正常的输出是:

1.1.1.1 test.test.com

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

感情废物 2022-09-05 22:42:20

原因如下:
1. 单引号中的变量不会展开
2. 如果想让子程序继承环境变量,需要使用export定义变量
3. sudo会选择性地传输环境变量

解释:
1. 试试 echo $USER '$USER'。这导致$ip_addr会由sh命令来解析,于是触发第二条。
2. 非export定义的变量只能在当前脚本中起作用,在子程序中不起作用。
3. HOSTNAME已经在系统环境变量中,即使你不设置它,也可以直接获取它的值,所以sudo之后的sh命令可以获取到HOSTNAME的值;但是ip_addr变量并会被sudo传输,所以sudo之后的sh命令得不到ip_addr变量的值。通过sudo -E参数可以让sudo传输所有环境变量。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文