Shell陷阱:$!和$?等变量在推送到远程主机执行时的取值问题

对于$!和$?这类依赖上下文的变量,当其作为命令行中的一部分被推送到远程主机执行时,一定要考虑到的它的特殊性,否则脚本很难按你预料的方式执行,并且由此引起的错误也很难定位。

让我们两个例子:

第一个例子是通过SSH向远程主机推送"创建用户组和用户“:

addUser()
{
    node=$1
    user=$2
    group=$3

    ssh -T root@$node <<EOF
    #add group if not exists
    egrep "^$group" /etc/group >& /dev/null
    if [ "$?" != "0" ]
    then
        groupadd "$group"
    fi
    #add user if not exists
    egrep "^$user" /etc/passwd >& /dev/null
    if [ "$?" != "0" ]
    then
        useradd -g "$group" "$user"
    fi
EOF
}

问题发生在:

   if [ "$?" != "0" ]

$?不是egrep "^$group" /etc/group >& /dev/null的执行结果!而是ssh登入之前本机执行的上一条命令的执行结果!

类似问题也出现在下面这段试图获取前一个后台运行进程的PID的脚本里:

ssh -T root@hdcoe01<<EOF
	su -l hive -c "nohup $HIVE_HOME/bin/hive --service metastore -hiveconf hive.log.file=hive-metastore.log \
	-hiveconf hive.log.dir=$HIVE_LOG_DIR>$HIVE_LOG_DIR/hive-metastore.out 2>$HIVE_LOG_DIR/hive-metastore.log &"
	su -l hive -c "echo $!|cat>$HIVE_PID_DIR/hive-metastore.pid"
EOF

这里的问题是, echo $!|cat>$HIVE_PID_DIR/hive-metastore.pid,$!的值并不是远程主机上hive metastore服务的PID,而是本机上前一个后台服务的PID!


类似问题也会发生在下面这段代码中:

    for node in ${NODES[@]}
    do
        echo -e "\033[0;33;1m------  [$node]  ------\033[0m"
        ssh -T root@$node<<EOF
        for logFile in $(find /var/log -type f)
        do
            echo "rm -f $logFile"
            rm -f $logFile
        done
EOF
    done

$(find /var/log -type f)列出的永远是本地的log文件而不会是远程主机上的。想要删除目标节点上的数据需要这样写:


    for node in ${NODES[@]}
    do
        echo -e "\033[0;33;1m------  [$node]  ------\033[0m"
        for logFile in $(ssh -T root@$node "find /var/log -type f")
        do
            echo "rm -f $logFile"
            ssh -T root@$node "rm -f $logFile"
        done
    done



简单地总结是:如果你打算通过SSH向远程主机推送命令,当命令中使用到$?或$1这类完全依赖上下文的变量时,你需要特别小心了,通常情况下,它们的取值完全不是你期望的!


  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Laurence 

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值