我正在创建一个脚本来在服务器之间迁移一些数据。
我的头痛:
(...)
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}\') '
,但仍然没有运气,我已经尝试了很多带有普通引号和双引号的可能性。
PS:抱歉我的“英语”
题外话:如果有人向我指出一些好文章(或一些要搜索的关键关键字)来解释/显示声明、显示和评估变量的所有可能性,我会很高兴,我不知道正确的术语。就像 ${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] [=======
....