サーバー間で一部のデータを移行するスクリプトを作成しています。
私の頭痛:
(...)
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] [=======
....