當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 也是能夠的,效果和上面的同樣。 設計

相關文章
相關標籤/搜索