2015-06-19 3 views
2

Я новичок в сценарии bash, и сейчас я работаю над скриптом bash, который должен загружать список файлов с сервера с помощью команды scp. Тем не менее, нет никакой гарантии, что файл есть, поэтому я хочу иметь возможность выводить список файлов, которые не были найдены. В настоящее время я делаю это, чтобы вывести сообщение об ошибке:Вывод Bash в конце программы

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

Код выше работает, насколько мне известно, но проблема у меня в том, что из-за того, как УПП работает, там уже будет тонна текста на экране (поскольку каждая команда scp будет показывать 100% загруженную строку), и я, вероятно, пропущу предупреждение или два. Есть ли простой способ для меня, чтобы все предупреждающие сообщения печатались в самом конце, имея список, которые не были найдены?

EDIT: Я забыл прояснить, почему я использую эхо вместо стандартного «файла не найденного» - мой код на самом деле должен выглядеть в нескольких местах, если он не может найти его в первую очередь. Таким образом, более полная версия выглядит вроде как это:

for FILENAME in [email protected] 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 

Если он не находит его в первом месте, это хорошо, но я только хочу, чтобы бросить ошибку, если я не могу найти его в любом из мест.

+0

Использовать '-q', чтобы сказать' scp', чтобы он был тихим? Повторите в конце аргументы в конце и посмотрите, существуют ли локальные файлы? Не эхо в том, что 'if' присоединяется к переменной массива и печатает этот массив в конце? echo вместо стандартной ошибки и передать это стандартное значение файла или канала в '/ dev/null' из' scp'? –

+0

@ Этан Рейснер: кажется, что '-q' скрывает только метр прогресса, а не stderr. –

+0

Строка из scp о файле, который не существует/не работает, - это, скорее всего, информация, которую фактически хочет OP (так как это делает для них работу). Если scp не содержит другую информацию об отказе, также связанную с stderr. –

ответ

1

Самый простой (хотя и не самое эффективное решение), чтобы просто проверить файл существование в конце.

Добавьте это после оригинального цикла:

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

В качестве альтернативы, если нормальный выход УПП не интересно (и вы не заботитесь о других возможных сбоях УППОВ), то первоначальный цикл мог бы стать:

for FILENAME in [email protected] 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 

Если вы хотите выход ПКПП (нормальный или ошибку или оба), но также хочет краткий список отсутствующих файлов в конце концов вы могли бы сделать это:

missing_files=() 
for FILENAME in [email protected] 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[@]}" 
+0

Последний был именно тем, что я искал; Спасибо! – Glamdring

3

Вы можете перенаправить поток ошибок в scp комманд в файл, а затем cat из файла в конце сценария:

for FILENAME in [email protected] 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 
+2

'2 >>/some/dir/error.log'? –

+0

Хороший улов.Мы в петле. Исправленный. – JNevill

+0

Что означает номер 2 в 2 >>? 2 >> /some/dir/error.log, кажется, берет весь вывод и помещает его в файл журнала, а затем выводит его в конце, но мне действительно нужно знать, какие файлы не были найдены во всех перечисленных (см. править в моем исходном сообщении) – Glamdring

Смежные вопросы