쉘 스크립트에 몇 가지 문제가 있습니다. 스크립트의 한 명령은 Jenkins 호스트에서 MySQL 데이터베이스 호스트로 명령 세트를 푸시하여 MySQL 데이터베이스에 "로컬로" 백업을 실행하는 데 사용됩니다.
나중에 사용하기 위해 변수를 내보낼 때 문제가 발생합니다. 익명의 예:
ssh -q -o Batchmode=yes mysql@${host} \
"export variable=$(ls -td ${backup_path}/FULL/*/ | head -1); \
echo $variable"
목표 ls -td
는 가장 최근에 작성된 디렉토리를 하위 디렉토리로 가져오는 것입니다 ${backup_path}/FULL
.
이 특정 명령을 실행할 때 발생하는 오류는 다음과 같습니다.
ls: cannot access ${backup_path}/FULL/*/: No such file or directory
echo는 $incr_basedir
빈 출력도 반환합니다.
${backup_path}/FULL에 하위 디렉터리가 있는지 확인하고 권한을 확인해 보았습니다. 결과는 다음과 같습니다.
-bash-4.2$ pwd
${backup_path}/FULL
-bash-4.2$ ls -l
total 498
drwxr-x---. 28 mysql mysql 2019 May 3 16:53 2017-05-03_16-47-37
목표를 계속 달성하려면 어떻게 해야 합니까?
답변1
Eric이 이전에 언급했듯이 이러한 문제는 범위 지정으로 인해 발생합니다.
나열되지 않은 복합 SSH 명령을 통해 전송되고 푸시된 여러 로컬 변수가 있는데, 여기에는 큰따옴표를 사용해야 합니다. ls -td를 원격으로 실행하기를 원했기 때문에 이 변수를 설정하기 위해 특별히 새로운 ssh 명령을 만들었습니다. 변수를 설정한 후 다른 변수와 마찬가지로 입력합니다.
export variable="$(ssh -q -o Batchmode=yes mysql@$host 'ls -td ${backup_dir}/FULL/*/ | head -1')"
오류가 더 이상 존재하지 않습니다. 사실 내 문제는 로컬 호스트가 원격 호스트의 범위와 동일한 디렉터리 구조를 가지고 있지 않다는 것입니다.