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!
简单地总结是:如果你打算通过SSH向远程主机推送命令,当命令中使用到$?或$1这类完全依赖上下文的变量时,你需要特别小心了,通常情况下,它们的取值完全不是你期望的!
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。