[Bash Shell程序设计]当while read遇上ssh


[Bash Shell程序设计]当while read遇上ssh
 
先看一段简化过的BASH SHELL代码 
 
TODAY=`date +%Y%m%d` 
SUFFIX="tar" 
CONF=the_config_file 
i=0 
 
while read HOST SRCPATH DSTPATH 
do 
        (( i++ )) 
        if [ "X${HOST:0:1}" = "X#" -o ${#DSTPATH} -eq 0 ] 
        then 
                #忽略注释行及少于3个项的记录 
        else 
                ssh ${HOST} "tar c ${SRCPATH}" >${DSTPATH}.${TODAY}.${SUFFIX} 2>/dev/null 
        fi 
done < $CONF 
 
作者的本意是通过脚本读取配置文件$CONF,然后打包备份$CONF中指定的文件,但执行后发现程序在成功备份$CONF中指定的第一个文件后即退出…… 
 
跟踪后发现read在备份完第一个文件后就再读不到任何数据,所以while循环结束--也就是说, 
通过重定向$CONF文件传给标准输入的数据被 
 
ssh ${HOST} "tar c ${SRCPATH}" >${DSTPATH}.${TODAY}.${SUFFIX} 2>/dev/null 
 
这个命令提前吃掉了。 
 
将其改为 
ssh ${HOST} "tar c ${SRCPATH}" >${DSTPATH}.${TODAY}.${SUFFIX} 2>/dev/null </dev/null 
 
将ssh的标准输入重定向到/dev/null,程序正常备份所有$CONF中指定的文件。 
 
-------------------------------------------------------- 
结论: 
 
while read时,要注意那些处理标准输入的命令,例如 
 
cat,mail,ssh,grep,sed,tr,awk……(几乎所有支持流文本处理的命令都包含在内)
 

相关内容

    暂无相关文章