当前位置: > shell编程 >

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

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

让我们两个例子:


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

 
  1. addUser()  
  2. {  
  3.     node=$1  
  4.     user=$2  
  5.     group=$3  
  6.   
  7.     ssh -T root@$node <<EOF  
  8.     #add group if not exists  
  9.     egrep "^$group" /etc/group >& /dev/null  
  10.     if [ "$?" != "0" ]  
  11.     then  
  12.         groupadd "$group"  
  13.     fi  
  14.     #add user if not exists  
  15.     egrep "^$user" /etc/passwd >& /dev/null  
  16.     if [ "$?" != "0" ]  
  17.     then  
  18.         useradd -g "$group" "$user"  
  19.     fi  
  20. EOF  
  21. }  

问题发生在:

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

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

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

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

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

 

 

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

 

(责任编辑:IT)
------分隔线----------------------------
栏目列表
推荐内容