Chinaunix首页 | 论坛 | 博客
  • 博客访问: 749956
  • 博文数量: 176
  • 博客积分: 2548
  • 博客等级: 少校
  • 技术积分: 1749
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-29 16:36
个人简介

爱咋咋地

文章分类

全部博文(176)

文章存档

2024年(1)

2023年(17)

2022年(19)

2021年(3)

2020年(1)

2018年(1)

2017年(1)

2014年(1)

2013年(4)

2012年(11)

2011年(19)

2010年(22)

2009年(71)

2008年(5)

分类: 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……(几乎所有支持流文本处理的命令都包含在内)
阅读(1311) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-03-27 16:05:49

很好的, 收藏了 推荐一个博客,提供很多免费软件编程电子书下载: http://free-ebooks.appspot.com