서버 간에 일부 데이터를 마이그레이션하는 스크립트를 만들고 있습니다.
내 두통:
(...)
ssh -t -i ${KEY} ${USER}@${HOST} "cd /home/${ACCOUNT}/var/${DOMAIN}/ && tar cf - mail/ -P | pv -s $(du -sb mail/ | awk '{print $1}') | gzip > mail.tar.gz"
명령은 "메일 폴더를 찾을 수 없습니다."와 같은 내용을 반환하며 그 이유를 알 것 같습니다.
이 명령은 SSH 연결 전에 평가되며 pv -s $(du -sb mail/ | awk '{print $1}')
메일 폴더는 첫 번째 서버에 존재하지 않습니다. 그러나 현재 바이트 크기를 하드코딩하면 스크립트가 작동합니다.
이 상황을 어떻게 우회할 수 있나요?
를 사용하겠지만 '
이미 을 사용하고 '{print $1}'
비슷한 것에 맞게 다른 변수를 만들어 보았지만 'pv -s $(du -sb mail/ | awk \'{print $1}\') '
여전히 운이 좋지 않았습니다. 일반 따옴표와 큰 따옴표를 사용하여 많은 가능성을 시도했습니다.
추신: "영어"로 인해 죄송합니다.
주제에서 벗어남: 누군가 나에게 변수 선언, 표시 및 평가의 모든 가능성을 설명/보여주는 좋은 기사(또는 검색할 주요 키워드)를 알려준다면 기쁠 것입니다. 올바른 용어를 모르겠습니다. ${var} 및 $var와 마찬가지로
"
or를 사용할 때 echo는 무엇을 하고'
, 중복된 따옴표, 큰 따옴표, 연결 등을 이스케이프하는 방법은 무엇입니까?
전체 스크립트 예:
clear
printf "\n\n"
echo "******************************** INTERWORX --> CPANEL *************************************"
printf "\n\n"
USER=root
HOST=xxx.xxx.xxx.xxx
PORT=xxxx
KEY=/var/somewhere
# ----------------
ACCOUNT=myaccount
DOMAIN=example.com
printf " ► ---------------------- [ ${HOST} ]\n"
printf " ►►---------------------- \n"
ssh -t -i ${KEY} ${USER}@${HOST} "cd /home/${ACCOUNT}/var/${DOMAIN}/ && tar cf - mail/ -P | pv -s \$(du -sb mail/ | awk '{print $1}') | gzip > mail.tar.gz"
printf "\n ►►► ------------ [ mail.tar.gz ]\n\n"
scp -i ${KEY} ${USER}@${HOST}:/home/${ACCOUNT}/var/${DOMAIN}/mail.tar.gz .
( ... )
답변1
귀하의 의견에서 디버깅 옵션을 언급하셨기 때문에 다음과 같은 답변이 필요하다고 생각합니다.
set -x
시퀀스의 첫 번째 명령 으로 사용됨
ssh -t -i ${KEY} ${USER}@${HOST} "set -x ; cd /home/${ACCO ....."
이는 귀하의 사례에서 실패 지점을 명확하게 보여줍니다.
도망칠 수 없어 $1
....
++ du -sb mail/
+ pv -s 12314 mail/ # <<< awk printed all the line instead of expected just 1st column with size and that ruined the command
pv: mail/: read failed: Is a directory
...
그리고 탈출
....
++ du -sb mail/
+ pv -s 12314 # <<< pv gets expected number
10kiB 0:00:00 [ 184MiB/s] [=======
....