いくつかのファイルを圧縮する必要がありますが、その1つはドットファイルです。
FILE1=/tmp/foo/.env
FILE2=/tmp/foo/docker-compose.yml
FILES="${FILE1#/} ${FILE2#/}"
tar -C / -cf /tmp/foo/files.tar "$FILES"
変数置換はtar: Removing leading '/' from member names
警告を防ぎ、解凍プロセスを簡素化します。
ただし、次のエラーが発生します。
tar: tmp/foo/.env tmp/foo/docker-compose.yml: 計算できません: そのファイルやディレクトリはありません。
ハードコーディングされたパスは有効ですtar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml
。
それでは、問題はドットファイルを処理することにありますか、それともエスケープに関連していますか?
答え1
シェルが拡張されると、"$FILES"
スペースは文法的価値を失います。したがって、コマンドはtar
単一のパスで受信されます。tmp/foo/.env tmp/foo/docker-compose.yml
良い
file='a b'
touch "$file"
a b
2つのファイルの代わりにファイルを生成しa
ますb
。
したがって、コメントで提案されているように、ファイルごとに異なる変数を使用する必要がありますtar -C / -cf /tmp/foo/files.tar "${FILE1#/}" "${FILE2#/}"
。
直接実行すると機能する理由tar -C / -cf /tmp/foo/files.tar tmp/foo/.env tmp/foo/docker-compose.yml
は、スペースにあるパラメータを他のパラメータと区別する構文値があるためです。 「人の目」には"$FILES"
拡張時に同じ空間が作成されますが、tmp/foo/.env tmp/foo/docker-compose.yml
この場合、空間は参照によって特別な意味を持たないため、値全体が単一パスと見なされます。