动态添加 /etc/hosts 问题


正确的版本:


 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

Linux hosts

幻想と真実と 10 years, 1 month ago

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

九十九屋真一 answered 10 years, 1 month ago

Your Answer