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

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

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

addUser(){node=$1user=$2group=$3ssh -T root@$node <<EOF#add group if not existsegrep "^$group" /etc/group >& /dev/nullif [ "$?" != "0" ]thengroupadd "$group"fi#add user if not existsegrep "^$user" /etc/passwd >& /dev/nullif [ "$?" != "0" ]thenuseradd -g "$group" "$user"fiEOF}问题发生在: if [ "$?" != "0" ]$?不是egrep "^$group" /etc/group >& /dev/null的执行结果!而是ssh登入之前本机执行的上一条命令的执行结果!

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

ssh -T root@hdcoe01<<EOFsu -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这类完全依赖上下文的变量时,你需要特别小心了,,通常情况下,它们的取值完全不是你期望的!

如果雨后还是雨,如果忧伤过后还是忧伤,

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

相关文章:

你感兴趣的文章:

标签云: