[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時,要注意那些處理標准輸入的命令,例如
cat,mail,ssh,grep,sed,tr,awk……(幾乎所有支持流文本處理的命令都包含在內)