web-dev-qa-db-ja.com

スクリプトから正しい終了コードを取得できません

SFTP経由でリモートサーバーに接続し、そこからファイルを取得するスクリプトがあります。私のスクリプトは次のようになります。

/usr/bin/sftp [email protected] <<EOF
lcd /dir1/dir2/dir3
cd /rsdir1/rsdir2/rsdir3
get file_pattern`date -d "last month" +%m%Y`.csv
EOF
rc=$?
        if [[ $rc != 0 ]]
           then
        echo "Error occured getting file and the script abended with error code $rc" `date "+%Y-%m-%d-%H.%M.%S"`
            exit 1
    else
    echo "Successfully transferred the file" `date "+%Y-%m-%d-%H.%M.%S"`
        fi

ただし、スクリプトがパターンのファイルを見つけられない場合でも、スクリプトのelse部分に移動し、画面に次のように出力します。

Connecting to remote.server.com...
sftp> lcd /dir1/dir2/dir3
sftp> cd /rsdir1/rsdir2/rsdir3
sftp> get file_pattern032014.csv
Couldn't stat remote file: No such file or directory
File "/rsdir1/rsdir2/rsdir3/file_pattern032014.csv" not found.
Successfully transferred the file YYYY-MM-DD-24HH.MI.SS 

私がここで間違っているかもしれないことについて何かアドバイスはありますか?

4
Dhruuv

正しいリターンコードを取得しました。sftpセッションが正しく実行されたため、リターンコードは0です。
代わりにscpを使用する必要があります。コピーに失敗しても、0は返されません。

あなたは次のようなことをすることができます:

file=file_pattern`date -d "last month" +%m%Y`.csv 
[email protected]:/rsdir1/rsdir2/rsdir3/$file
local=/rsdir1/rsdir2/rsdir3/$file

if scp -q $remote $local
then
    echo "Successfully transferred the file" `date "+%Y-%m-%d-%H.%M.%S"`
else
    echo "Error occured getting file and the script abended with error code $?" `date "+%Y-%m-%d-%H.%M.%S"`
    exit 1
fi

編集:コピー対象をファイル名に変更しました:ディレクトリにコピーし、そのディレクトリが見つからない場合は、ディレクトリ名を持つファイルを作成します。

9
Emmanuel

次のことを試してください。

/usr/bin/sftp -b - [email protected] <<EOF ...

「-b-」は、コマンドラインからの読み取り中にsftpをバッチモードにします。バッチモードは(私のシステムでは)sftpを終了し、sftpコマンドの1つが失敗するとゼロ以外の終了コードを返します。

2
user111870