程序结束时的Bash输出

时间:2015-06-19 15:17:54

标签: bash

我是bash脚本的新手,我正在使用bash脚本,现在应该使用scp命令从服务器下载文件列表。但是,不能保证文件存在,所以我希望能够输出未找到的文件列表。目前,我这样做是为了输出错误消息:

for FILENAME in $@ do
scp $SERVER:/home/usr/$FILENAME .
  if [ $? -ne 0 ] then
    echo "WARNING: $FILENAME was not found in $SERVER."
  fi
done

上面的代码据我所知,但我遇到的问题是由于scp如何工作,屏幕上已经有大量的文本(因为每个scp命令都是将显示100%下载的行)我可能会错过一两个警告消息。有没有一种简单的方法让我在最后打印所有警告信息,列出哪些文件没有找到?

编辑:我忘了澄清为什么我使用的是echo而不是默认的"文件未找到" - 我的代码实际上应该在多个位置查看,如果它无法在第一时间找到它。因此,更完整的版本看起来像这样:

for FILENAME in $@ do
scp $SERVER:/home/usr/$FILENAME .
  if [ $? -ne 0 ] then
      scp $SERVER:/home/usr/documents/$FILENAME .
      if [ $? -ne 0 ] then
         scp $SERVER:/home/usr/documents/local/$FILENAME .
         if [ $? -ne 0 ] then
           echo "WARNING: $FILENAME was not found in $SERVER."
         fi
      fi
  fi
done

如果它在第一个位置找不到,那很好,但如果我无法在任何位置找到它,我只希望它发出错误。

2 个答案:

答案 0 :(得分:3)

您可以将scp命令的stderr重定向到一个文件,然后cat将脚本末尾的文件重定向:

for FILENAME in $@ do
scp $SERVER:/home/usr/$FILENAME . 2>> /some/dir/error.log
  if [ $? -ne 0 ] then
    echo "WARNING: $FILENAME was not found in $SERVER."
  fi
done

cat /some/dir/error.log
rm /some/dir/error.log

答案 1 :(得分:1)

最简单的(虽然不是最有效的解决方案)是在最后检查文件是否存在。

在原始循环之后添加:

for FILENAME in $@ do
    if [ -s "$FILENAME" ] then
        echo "WARNING: $FILENAME was not found in $SERVER." >&2
    fi
done

或者,如果正常的scp输出不感兴趣(并且您不关心其他潜在的scp失败),那么原始循环可能变为:

for FILENAME in $@ do
scp -q $SERVER:/home/usr/$FILENAME . 2>/dev/null
  if [ $? -ne 0 ] then
      scp -q $SERVER:/home/usr/documents/$FILENAME . 2>/dev/null
      if [ $? -ne 0 ] then
         scp -q $SERVER:/home/usr/documents/local/$FILENAME . 2>/dev/null
         if [ $? -ne 0 ] then
           echo "WARNING: $FILENAME was not found in $SERVER."
         fi
      fi
  fi
done

如果你确实想要scp输出(正常或错误或两者兼而有之),但想要最后一个简洁的丢失文件列表,你可以这样做:

missing_files=()
for FILENAME in $@ do
scp $SERVER:/home/usr/$FILENAME .
  if [ $? -ne 0 ] then
      scp $SERVER:/home/usr/documents/$FILENAME .
      if [ $? -ne 0 ] then
         scp $SERVER:/home/usr/documents/local/$FILENAME .
         if [ $? -ne 0 ] then
           missing_files+=("$FILENAME")
         fi
      fi
  fi
done

echo 'Missing files:'
printf %s\\n "${missing_files[@]}"
相关问题