读取线路循环的shell脚本在第一行之后停止

我有以下的shell脚本。 目的是循环通过目标文件(其path是脚本的input参数)的每一行,并针对每一行进行工作。 现在,它似乎只能用于目标文件的第一行,并在处理该行后停止。 我的脚本有什么问题吗?

#!/bin/bash # SCRIPT: do.sh # PURPOSE: loop thru the targets FILENAME=$1 count=0 echo "proceed with $FILENAME" while read LINE; do let count++ echo "$count $LINE" sh ./do_work.sh $LINE done < $FILENAME echo "\ntotal $count targets" 

问题是, do_work.sh运行ssh命令,默认情况下, ssh从你的input文件stdin中读取数据。 因此,你只能看到第一行处理,因为ssh消耗文件的其余部分,而你的循环终止。

为了防止出现这种情况,请将-n选项传递给您的ssh命令,使其从/dev/null而不是stdin中读取。

ssh -n选项可防止在将输出传输到另一个程序时使用HEREdoc检查ssh的退出状态。 所以使用/ dev / null作为stdin是首选。

 #!/bin/bash while read ONELINE ; do ssh ubuntu@host_xyz </dev/null <<EOF 2>&1 | filter_pgm echo "Hi, $ONELINE. You come here often?" process_response_pgm EOF if [ ${PIPESTATUS[0]} -ne 0 ] ; then echo "aborting loop" exit ${PIPESTATUS[0]} fi done << input_list.txt 

使用ssh -n ...通过ssh运行远程命令。