端末とbashスクリプトで実行すると、検索コマンドの結果が異なります。

端末とbashスクリプトで実行すると、検索コマンドの結果が異なります。

これは私の立場では概念的なエラーかもしれませんが、この時点では少し混乱しています。

ローカルおよびリモートホストの特定のフォルダ(サブフォルダを含む)で、最近作成されたファイルのタイムスタンプを確認して、rsyncプロセスが実行していることは正常に機能しています。

だから私は調査した結果、次のコマンドを思い出しました。

find ${LOCAL_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | head -n 1 | { read -a array ; echo ${array[0]} ; }

そして、リモートホストとフォルダのSSHバージョンは次のとおりです。

ssh -i ${RSA_PRIVATE_KEY} ${REMOTE_USER}@${REMOTE_IP} 'find ${REMOTE_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | head -n 1 | { read -a array ; echo ${array[0]} ; }

管理者アカウントではなく通常のセッションユーザーを使用して端末でこのコマンドを実行すると、正常に動作し、UNIXタイムスタンプが表示されます。

そのため、違いがN秒より大きい場合に警告できるように、これら2つのコマンドをコピーして結果を減算するbashスクリプトを作成しました。しかし、それは動作しません。これはコーディングエラーではないように見え、bashスクリプトで実行するとsshコマンドが別の値を返すだけです。長年の違いがある非常に異なる価値です。

IMHO、sshを介してアクセスするのではなく、何らかの方法で空のフォルダにアクセスし、隠されたフォルダ(「./ssh/」など)を含めることです。しかし、なぜそうなのかわかりません。

スクリプトには次のコードがあります。

LOCAL_FOLDER=/home/myuser/myfolder/data/
REMOTE_FOLDER=/var/www/sites/all/data/
RSA_PRIVATE_KEY=/home/myuser/.ssh/id_rsa_Test
REMOTE_IP=XXX.XXX.XXX.XXX
REMOTE_USER=my-remote-user

last_local_timestamp=$(find ${LOCAL_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | head -n 1 | { read -a array ; echo ${array[0]} ; })
last_remote_timestamp=$(ssh -i ${RSA_PRIVATE_KEY} ${REMOTE_USER}@${REMOTE_IP} 'find ${REMOTE_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | head -n 1 | { read -a array ; echo ${array[0]} ; }')
test=$(ssh -i ${RSA_PRIVATE_KEY} ${REMOTE_USER}@${REMOTE_IP} 'find ${REMOTE_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | head -n 1 ')
echo $test
time_diff=$((${last_local_timestamp%.*} - ${last_remote_timestamp%.*}))
echo LOCAL: ${last_local_timestamp%.*}
echo REMOTE: ${last_remote_timestamp%.*}
echo DIFF: ${time_diff}

何が起こったのか知っていますか?

編集:次の文書を使用して修正を試してください。

last_local_timestamp=$(find ${LOCAL_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | sed -e 's/^[^ ]* //')
last_remote_timestamp=$(ssh -i ${RSA_PRIVATE_KEY} ${REMOTE_USER}@${REMOTE_IP} <<- EOF
    find ${REMOTE_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | sed -e 's/^[^ ]* //'
    EOF )
test=$(ssh -i ${RSA_PRIVATE_KEY} ${REMOTE_USER}@${REMOTE_IP} <<- EOF
    find ${REMOTE_FOLDER} -type f -printf "%C@ %p\n" | sort -rn | head -n 1
    EOF )

ベストアンサー1

  1. 出力をパイプhead -n 1で接続しread -a arrayてから配列の最初の要素を印刷するのはなぜですか?| sed -e 's/^[^ ]* //'最初のスペースの前にあるすべての内容を削除してみてください。つまり、行の先頭からタイムスタンプを削除します。

  2. 変数を参照してください。中かっこを使うことはいいえ引用符を置き換える唯一の目的は、変数名の一部として解釈される隣接文字から変数名を明確にすることです。

  3. ${REMOTE_FOLDER}~へ一つ-quotes(つまり、sshコマンド内)は、次のことを行うリテラル文字列です。いいえ$ REMOTE_FOLDERの値を評価します。引用符は、特に複数のレベルの入れ子になった引用符がある場合、または必要に応じてシェル内で常にPITAです。引用符の代わりに区切り文字を使用してみてください。使いやすくなります。

おすすめ記事