2016-07-28 3 views
1

Я автоматизирую ftp-сессию, но хочу взять stdout и передать ее в файл. Я пришел с 3-мя вариантами:Где я могу подключиться к файлу при использовании встроенного << EOF ... EOF?

Вариант 1

ftp -i ftpServer >stdoutFile <<EOF 
cd somewhere 
get something 
EOF 

Вариант 2

ftp -i ftpServer <<EOF >stdoutFile 
cd somewhere 
get something 
EOF 

Вариант 3

ftp -i ftpServer <<EOF 
cd somewhere 
get something 
EOF > stdoutFile 

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

Мне кажется, что я как-то доработал это раньше, но я не могу вспомнить, как это сделать.

Редактировать

Ошибки синтаксиса все еще присутствуют. Похоже, если я использую этот метод с документом под названием EOF, я не могу использовать этот делитель где-нибудь еще в скрипте - странно.

Точная ошибка, которая возникает, на самом деле является сбой при следующем завершении if-statement. Например:

if [ condition ] 
then 
    ftp -i ftpServer >stdoutFile <<EOF 
    cd somewhere 
    get something 
    EOF 
fi 

if [ something else ] 
then 
    somethingWithaHereDoc <<EOF 
    foo 
    bar 
    EOF 
fi 

я Syntax error near unexpected token 'fi' указывающий на линию последних фи.

Соединение FTP теперь висит. Я использую файл ~/.bashrc, и он работает в другой консоли, но не в скрипте. У меня случайно был именованный канал в каталоге, в результате чего ftp-сессия зависала. Все разрешено сейчас. благодаря!

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

+2

Варианты 1 и 2 должны оба работают. –

+2

Пожалуйста, покажите синтаксические ошибки, которые вы получаете, и контекст. Вариант 3, конечно, не удастся, но первые два должны быть в порядке. – cdarke

+0

Ваши первые и все приведенные выше варианты верны, но ваш 'EOF' должен быть единственной вещью в строке: никаких ведущих вкладок или пробелов, никаких отстающих барахлов. Проблема, которую вы видите, это bash, которая не распознает терминатор. – gilez

ответ

4

В <<EOF только сигналы что здесь документ начнет на следующей строке. Вы можете свободно смешивать это с другими переадресациями, поэтому варианты 1 и 2 действительны. Между ними нет никакой разницы, хотя я подозреваю, что большинство людей предпочтут и предложит вариант 1, поскольку он, похоже, не «вставляет» перенаправление вывода в документ здесь.

Если вы получаете синтаксические ошибки с помощью варианта 1 или варианта 2, они почти наверняка не связаны с самим документом.

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

+0

Это помогает мне понять, спасибо. Я отредактировал вопрос, потому что у меня все еще есть проблемы. –

+0

Пожалуйста, добавьте * точную команду *, которая вызывает ошибку, а также * точную * ошибку. То, что у вас сейчас, недостаточно для диагностики проблемы. Вы должны иметь возможность использовать разделитель в другом месте документа здесь; только разделитель сам по себе на одной строке должен прервать этот документ. – chepner

0

Возможно, вы захотите процитировать первые EOF. Вариант 3 не прерывает heredoc, поэтому он ошибочен, но другие 2 должны работать (я обычно использую вариант 2). Вы хотите, чтобы ssh вместо ftp (т. Е. Пытаетесь ли вы выполнить операцию, которая производит вывод или захват файла)?ниже, как я SSH:

ssh ... << 'EOF' > file 
remote commands here 
EOF 

может также трубы для локального процесса:

ssh ... << 'EOF' | awk ... 
remote commands here 
EOF 
+2

В этом вопросе нет ничего, чтобы предположить, что цитирование 'EOF' является либо необходимым, либо неправильным; это зависит исключительно от того, каким должно быть содержание этого документа. – chepner

+0

Ваше право, Цитата не всегда не требуется, за исключением того, что в этом случае содержимое heredoc явно включает в себя компакт-диск, который, вероятно, не нужен на локальном сервере, а скорее на удаленном сервере. Чтобы выполнить его на удаленном сервере, вы должны указать его – CSTobey

+2

@CSTobey, неверно. Котировки не позволяют ** расширениям ** запускаться локально, но 'cd' не находится в какой-либо подстановке или расширении. Если бы это было, скажем, '$ (cd something; printf 'put% q \ n' * .txt)', а не просто 'cd где-то', тогда вы были бы правы, но это не тот случай. –

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