2016-07-28 4 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というhere-documentでこのメソッドを使うと、あたかもスクリプトのどこにでもそのdelimeterを使うことができないように見えます。

実際に生成される正確なエラーは、実際には次のif文終了時のエラーです。たとえば、

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'が最後のfiの行を指しています。

現在、FTP接続がハングしています。私は〜/ .bashrcファイルを使用していますが、別のコンソールでは動作しますが、スクリプトでは動作しません。私は誤ってディレクトリに名前付きパイプを持ち、ftpセッションがハングする原因となりました。すべてが解決されました。ありがとう!

私がこれをやっているのは、ftpサーバから特定のファイルをダウンロードしたいからです。 ftpセッションを終了してbashで処理し、別のftpセッションを開始して、選択したファイルを取得します。

+2

オプション1と2の両方の仕事をする必要があります。 –

+2

取得している構文エラーとそのコンテキストを表示してください。オプション3は確実に失敗しますが、最初の2つはOKです。 – cdarke

+0

上記の最初と2番目のオプションは正しいですが、あなたの 'EOF'が行の唯一のものでなければなりません:先導タブもスペースもなく、末尾のジャンクもありません。あなたが見ている問題は、bashがターミネーターを認識していないことです。 – gilez

答えて

4

ここに文書が次の行にを開始します<<EOFのみ信号。これを他のリダイレクトと自由に混在させることができるので、オプション1と2はどちらも有効です。この2つの間に違いはありませんが、私はほとんどの人がオプション1を好んで提案していると思われますが、出力リダイレクトをここの文書に「挿入」するようには見えません。

オプション1またはオプション2のいずれかで構文エラーが発生している場合は、ここのドキュメント自体とはほとんど関係がありません。

オプション3は無効です。ここでは、ドキュメントの区切り文字は1行に記述する必要があり、元のコマンドの一部ではないためです。

+0

これは私の理解に役立ちます、ありがとう。私はまだ問題があるので、私は質問を編集しました。 –

+0

* exact *エラーと共に、エラーを生成する* exact *コマンドを追加してください。あなたが今持っているものは、問題を診断するのに十分ではありません。ここでは区切り文字を使用することができます。区切り文字だけを1行に記述すると、ここの文書が終了します。 – chepner

0

最初にEOFを引用します。オプション3は、heredocを終了させないので間違っていますが、他の2つはうまくいくはずです(私は一般にオプション2を使用します)。 ftpの代わりにsshが必要ですか(つまり、出力を生成する操作を実行しようとしていますか、ファイルをつかんでいますか?以下は、私はSSHを行う方法です。

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

こともローカルプロセスへのパイプ:

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

'EOF'の引用が必要かどうかを示唆することは何もない。本書の内容が何であるべきかだけに依存します。 – chepner

+0

あなたの権利は、必ずしも必要なわけではありませんが、この場合、heredocの内容には明示的にcdが含まれています。おそらくローカルサーバーではなく、リモートサーバー上にあります。リモートサーバー上で実行するには、 – CSTobey

+2

@CSTobeyと間違っています。引用符は、**拡張子**がローカルで実行されることを防ぎますが、 'cd'はいかなる置換や拡張の内部にもありません。 'cd somewhere'だけでなく、' $(cd somewhere; printf 'put%q \ n' * .txt) 'であれば正しいでしょうが、そうではありません。 –

関連する問題