
次のような類似のフラグを使用して複数のコマンドを実行したいとします。
du -sh / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
tar cvf archive / --exclude=dir1 --exclude=dir2 --exclude=dir3/dir4
フラグのシーケンスを再利用し--exclude
、たとえばこれらのフラグを変数に保存するなどして、コードをよりクリーンにしたいと考えています。
すると、上記のコマンドは次のようになります
du -sh / "$EFLAGS"
tar cvf archive / "$EFLAGS"
tar
指定されたディレクトリに関連するファイルとディレクトリを除外することに注意してください。
最良かつ最もクリーンな解決策は何でしょうか?
背景
tar を使用してシステムをバックアップし、不要なディレクトリを除外したいと考えています。
答え1
これを試すことができます:
$ echo -e / --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
/ --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
$ echo !!:3-$
echo --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
--exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4
bash
ここでは履歴展開を使用します。
!!
最後のコマンドを参照3-$
最後の3番目のパラメータを参照する
bash
非対話型シェルでは無効になっている履歴拡張機能をスクリプトでオンにする必要があります。
set -o history
set -o histexpand
答え2
Bash では、配列を使用するのが非常にクリーンな方法です。
myflags=( --exclude=/dir1 --exclude=/dir2 --exclude=/dir3/dir4 )
tar cvf archive / "${myflags[@]}"
スペースやその他の奇妙な文字も処理できます。
myflags=( "--exclude=/a dir/with spaces" $'--exclude=/a dir/with\nnewlines' )
tar cvf archive / "${myflags[@]}"
/this/one
これらも偽造される可能性があります。たとえば、文字 を含むディレクトリ のすべてのサブディレクトリを除外したい場合、次のようになりますg
。
exclude_dirs=( /this/one/*g* )
myflags=( "${exclude_dirs[@]/#/--exclude=}" )
tar cvf archive / "${myflags[@]}"
答え3
これをコメントとして追加するつもりでしたが、コメントのフォーマット方法がわかりませんでした。
とにかく、90% は達成できたと思います。次のことを試してみてください:-
EFLAGS="--exclude=/dir1 --exclude=/dir2"
du -sh / $EFLAGS
tar cvf archive / $EFLAGS
最初の行にはスペースが含まれているため引用符が必要です。
変数を使用するときは引用符を使用せず、引数をスペースで分割します。
除外されるディレクトリ名にスペースが含まれている場合は、エスケープする必要があります。