爱咋咋地
分类: LINUX
2011-03-10 12:27:05
先看一段简化过的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 将ssh的标准输入重定向到/dev/null,程序正常备份所有$CONF中指定的文件。 -------------------------------------------------------- 结论: while read时,要注意那些处理标准输入的命令,例如 cat,mail,ssh,grep,sed,tr,awk……(几乎所有支持流文本处理的命令都包含在内) |
chinaunix网友2011-03-27 16:05:49
很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com