搜索
linux - 动态添加 /etc/hosts 问题
迷茫
迷茫 2017-04-17 11:59:52
[Linux讨论组]

正确的版本:

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
迷茫
迷茫

业精于勤,荒于嬉;行成于思,毁于随。

全部回复(1)
怪我咯

原因如下:
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传输所有环境变量。

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号