2016-07-28 52 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語句終止時的失敗。例如:

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肯定會失敗,但前兩項應該沒問題。 – cdarke

+0

你上面的第一個和第二個選項是正確的,但是你的'EOF'必須是唯一的一行:沒有前導標籤或空格,也沒有尾隨垃圾。你看到的問題是bash不認識終結者。 – gilez

回答

4

<<EOF只有信號一個here文檔將開始下一行。你可以自由地將其與其他重定向混合,所以選項1和2都是有效的。兩者之間沒有區別,儘管我懷疑大多數人會喜歡並建議選項1,因爲它似乎沒有將輸出重定向「插入」到here文檔中。

如果您使用選項1或選項2得到語法錯誤,它們幾乎肯定與here文檔本身無關。

選項3無效,因爲這裏的文檔分隔符必須單獨出現在一行上,並且因爲它不是原始命令的一部分。

+0

這有助於我的理解,謝謝。我編輯了這個問題,因爲我仍然有問題。 –

+0

請添加* exact *命令以產生錯誤,以及* exact *錯誤。你現在擁有的是不足以診斷問題的。您應該能夠在here文檔的其他地方使用分隔符;在單行上只有分隔符本身應該終止這裏的文檔。 – 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的內容顯式包含一個cd,這可能不是本地服務器上需要的,而是在遠程服務器上。要在遠程服務器上執行它,必須引用它 – CSTobey

+2

@CSTobey,不正確。引號防止**擴展**在本地運行,但「cd」不在任何類型的替換或擴展中。如果是,例如'$(cd somewhere; printf'put%q \ n'* .txt)',不僅僅是'cd somewhere',那麼你會是對的,但事實並非如此。 –

相關問題