动态添加 /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
幻想と真実と
10 years, 1 month ago
Answers
原因如下:
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