2016-09-26 2 views
1

Я создал сценарий bash, чтобы временно помочь мне отправить некоторые файлы на FTP-сервер на основе идентификатора commit, я получу последний коммит, отслеживаю файлы и отправляю их в списке ниже.Получить вывод FOR с EOF в bash

#!/bin/bash 

commit_hash=$(git log --format="%H" -n 1) 

[[ -z "$1" ]] || commit_hash=$1 

files=$(git diff-tree --no-commit-id --name-only -r $commit_hash) 

echo -e $(git log -1 $commit_hash --pretty=format:"%h - %an, %ar : %s"); 
printf "\n" 

HOST= 
USER= 
PASS= 

for file in $files; do 
ftp -nv $HOST << EOF 
user $USER $PASS 
cd /www/example 
passive 
put $file 
bye 
EOF 

done; 

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

можно поймать выход ftp heredoc и применить некоторые фильтры? например, с конвейерами, я только хочу знать, успешно ли завершена передача.

+0

Как насчет проверки кода состояния выхода 'ftp' с переменной' $? 'Bash? Он может содержать достаточно информации, чтобы выяснить, удалось ли выполнить запрос. – redneb

ответ

1

можно поймать выход ftp heredoc и применить некоторые фильтры? например, с конвейерами, я только хочу знать, успешно ли завершена передача.

Предполагаете, вы хотите, чтобы вы поймали выход команды ftp, чей ввод перенаправлен из heredoc; сам heredoc не имеет выхода в том смысле, что ничего, кроме соответствующей команды, не видит.

Но вы можете перенаправить вывод команды. Следует помнить, что heredoc начинается на следующей строке, а не сразу после соответствующего оператора перенаправления. Таким образом, вы можете добавить конвейер в другую команду после оператора heredoc. Например:

$ cat << EOF | grep flag 
flag this line 
not this line 
or this line 
flag this 
last flag 
EOF 

Выход:

flag this line 
flag this 
last flag 
1

Не используйте for петлю для этого. См. Bash FAQ 001.

commit_hash=${1:-$(git log --format="%H" -n 1)} 

while IFS= read -r file; do 
    ftp -nv "$HOST" << EOF 
user $USER $PASS 
cd /www/example 
passive 
put $file 
bye 
EOF 
done < <(git diff-tree --no-commit-id --name-only -r "$commit_hash") 
Смежные вопросы