Diff でファイルが存在しないと表示されます – なぜでしょうか?

Diff でファイルが存在しないと表示されます – なぜでしょうか?

リモート サーバーからローカル サーバーにファイルを転送します。これが完了したら、diff を実行して両方のファイルが同一かどうかを確認し、転送が成功したかどうかを確認します。そのため、次のようにします。

ssh -o StrictHostKeyChecking=no -l ${SSH_USER} ${SSH_HOST} "cat $FOLDERPATH_REMOTE.tar.gz" | diff - "$FOLDERPATH_LOCAL.tar.gz"
    if [[ $? -eq 0 ]]; then
        echo "\n##### Remove file from remote machine #####\n"
        rm -f $FOLDERPATH_REMOTE.tar.gz
    fi

これを実行すると、常に次のようなエラーが発生します。

diff: /home/backups/test.tar.gz: No such file or directory

そして

[[: not found

しかし、実行すると、cat /home/backups/test.tar.gzファイルが存在します。そのため、何らかの理由で、コマンドはローカル システムとリモート システムを区別せず、ssh コマンドの後の if は実行されません。

私が何を間違っているのか誰か知っていますか?

PS: もう一つの初心者向けの質問ですが、変数はいつこのように記述する必要があり${VAR}、いつのように記述する必要があるのでしょうか$VAR?

答え1

rsyncと一緒に使用します--remove-source-files

rsync --remove-source-files "${SSH_USER}@${SSH_HOST}:$FOLDERPATH_REMOTE.tar.gz" \
                            "$FOLDERPATH_LOCAL.tar.gz"

他の質問への回答として、${VAR}変数名を単語の途中に置く場合はを使用する必要があります。-.は適切な区切り文字ですが、 で_はありません。

echo $var.txt      # same as ${var}.txt
echo $var-2020.txt # same as ${var}-2020.txt
echo $var_2020.txt # same as ${var_2020}.txt

[ "$?" -eq 0 ]エラーを回避するには、を使用する必要があります[[ not found。OS については言及していませんが、/bin/sh として bash がないようです。もちろん、 を使用する場合は、これらは必要ありませんrsync

関連情報