当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时,要注意那些处理标准输入的命令,例如

ssh

cat,mail,ssh,grep,sed,tr,awk……(几乎全部支持流文本处理的命令都包含在内) spa

使用ssh -n 也是能够的,效果和上面的同样。 设计

相关文章
相关标签/搜索