FTP "put" はシェルスクリプトで実行するとファイルをリモートホストにコピーしませんが、手動で実行するとコピーします。

FTP "put" はシェルスクリプトで実行するとファイルをリモートホストにコピーしませんが、手動で実行するとコピーします。
ftp -n ${FTP_HOST} << STOP
    user ${FTP_USERNAME} ${FTP_PASSWORD}

    binary
    lcd ${FTP_FROM_DIR}
    cd ${FTP_TO_DIR}
    put ${reportFileName}   
STOP

私のコードは次のとおりです。ファイルをリモートホストに正常にコピーできませんでしたが、手動で使用すると、ファイルはリモートホストに正常にコピーされます。

スクリプトで実行すると、コンソールに「(ローカルファイル)の使用法:ローカルファイルのリモートファイルを入れる」と表示されます。

何が問題なのでしょうか?

答え1

私はあなたの問題のいくつかが区切り文字を構成する方法にあると思います。次のようにしてみてください。

$ ftp -n ${FTP_HOST} << STOP
user ${FTP_USERNAME} ${FTP_PASSWORD}

binary
lcd ${FTP_FROM_DIR}
cd ${FTP_TO_DIR}
put ${reportFileName}   
STOP

コマンドでこれらのスペース/タブを実際に使用するには、次の形式のheredocに変更する必要があります。

$ ftp -n ${FTP_HOST} <<-STOP
    user ${FTP_USERNAME} ${FTP_PASSWORD}

    binary
    lcd ${FTP_FROM_DIR}
    cd ${FTP_TO_DIR}
    put ${reportFileName}   
STOP

区切られた文書にスペース/タブがあるときはいつでも、forを使用して<<-その中に含まれるコマンドを実行する前に、前のスペース/タブを削除するようにシェルに指示する必要があります。

エコ使用のためのサイドバー

スクリプトで変数を解析し、誤ってそれを使用してechoメッセージを印刷する場合は、興味のある文字列よりも多くを取得することがよくあります。echo末尾の改行文字も含まれます。この例では確認できます。

$ echo $(echo hi) | hexdump -C
00000000  68 69 0a                                          |hi.|
00000003

0a改行文字のASCIIコードです。したがって、-nこの動作を無効にするには、通常、次のスイッチを使用する必要がありますecho

$ echo -n $(echo hi) | hexdump -C
00000000  68 69                                             |hi|
00000002

またはprintf

引用する

関連情報