複数のコマンドで同様のフラグを再利用する

複数のコマンドで同様のフラグを再利用する

次のような類似のフラグを使用して複数のコマンドを実行したいとします。

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

最初の行にはスペースが含まれているため引用符が必要です。

変数を使用するときは引用符を使用せず、引数をスペースで分割します。

除外されるディレクトリ名にスペースが含まれている場合は、エスケープする必要があります。

関連情報