私はこのトピックが完全に明確であると確信しています:)冗談です。私が見つけた問題のいくつかは、クエリを書くことです。
配列を引数として bash スクリプトからコマンドを実行するときに幸運でした。
たとえば、rsyncを呼び出して次の配列を作成しました(スポイラー警告 - 冗長変数は後で参照されます)。
#!/usr/bin/env bash
set -euo pipefail
rf=.rsync-filter
srcff="/home/roger/home$rf"
hm=/home/roger
syncto=/tmp/to-remote/home
rsarg=(-avv --prune-empty-dirs --stats)
rsarg+=(--dry-run)
rsync "${rsarg[@]}" "$hm" "$syncto/" #works
exit
問題があるのは、$ srcff変数をフィルタルールに追加し、それをrsarg配列に追加することです。
rsarg+=("--filter='merge $srcff'") # no dice
# or this
rsarg+=("--filter='merge ${srcff}'") # sad trombone
実行した後、次のようになります。
$ ./home-sync-simple
Unknown filter rule: `'merge /home/roger/home.rsync-filter''
rsync error: syntax or usage error (code 1) at exclude.c(904) [client=3.1.1]
配列外のrsync行にマージルールを追加し、含まれている変数を減算することで機能させることができます。
rsync "${rsarg[@]}" --filter='merge /home/roger/home.rsync-filter' "$hm" "$syncto/"
上記のフィルタを配列外の変数に置き換えることも同じ方法で失敗します。
rsync "${rsarg[@]}" "--filter='merge $srcff'" "$hm" "$syncto/"
私は他の多くのバリエーションを試しましたが、実際に動作するバリエーションを除いて、すべての可能なバリエーションを想定しています。時には、「予期しないフィルタルールの終わり:マージ」やその他の状況が発生します。簡潔さのために、上記のバージョンは正確に近いと思うので、これらのバージョンを除外しました(彼は焦っていました)。パラメータが少なすぎたり、渡されすぎているようです。
よろしくお願いします!
答え1
これが機能する場合:
rsync "${rsarg[@]}" --filter='merge /home/roger/home.rsync-filter' ...
それからあなたはそうだと思います。いいえ一重引用符を追加したいですrsync
。ここでは貝殻がrsync
見える前にそれを食べます。別の例には、引用符の中に引用符が含まれているため、内部引用符は保存され、表示できるように渡されrsync
ます。
したがって、配列を作成するときに一重引用符をスキップします。
rsarg+=("--filter=merge $srcff")
シェルの観点からは、等号には特別なものはなく、次の部分は前の部分とは異なる方法で処理する必要はありません。 orまたはEvenと同じです--foo=bar
。--foo="bar"
"--foo=bar"
--fo"o=ba"r