터미널 및 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초보다 클 경우 경고할 수 있도록 이 두 명령을 복사하고 결과를 빼는 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입니다. 따옴표 대신 구분 기호를 사용해 보십시오. 사용하기가 더 쉬울 것입니다.

관련 정보