先看一段簡化過的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 也是能夠的,效果和上面的同樣。 設計