http://hi.baidu.com/test/blog/item/16ecf01f6f46e4f7e0fe0b10.html
当while read 遇上ssh
2007-08-15 21:13先看一段简化过的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中指定的文件。