ファイル名を引数として使用し、標準出力をすべてのファイルにコピーするロギング機能が必要です。これまで私が思いついた内容は次のとおりです。
function logger() {
exec > >(tee -ia /var/log/{log1,log2})
}
{log1,log2}
に置き換えようとすると、スペース{$*}
で区切られた引数が表示されます。だから私は次のことをしなければならないと思いました。
function logger() {
exec > >(IFS=,; tee -ia /var/log{"$*"}
}
変数置換の前に角かっこ拡張が発生するので、これは私が望むことを行いません。だから私はこれを行うことができると思いました。
function logger() {
exec > >(IFS=,; eval "tee -ia /var/log/\{$*\}")
}
ただし、動作は同じです。つまり、logger one two
。{one,two}
なぜそんなことですか?tee
複数のファイルに書き込むために中括弧拡張を実行するにはどうすればよいですか?
答え1
の中括弧拡張内では変数を使用できませんbash
。たとえば、参照してください。シーケンスのシェル中括弧拡張で$variableを使用する方法は?
logger
関数を呼び出したくない場合
logger /var/log/log{1,2}
関数は次のように書かれます。
logger () {
exec > >( tee -ia "$@" )
}
それでは、あなたができることは電話しています。
logger log{1,2}
または
logger log1 log2
関数を次のように作成します。
logger () {
for fname do
set -- "$@" "/var/log/$fname"
shift
done
exec > >( tee -ia "$@" )
}
または、より短いですが(やや読めません)。
logger () {
set -- "${@/#//var/log/}"
exec > >( tee -ia "$@" )
}
または必要に応じて
logger () {
exec > >( tee -ia "${@/#//var/log/}" )
}
/var/log/
これは、各位置パラメータの先頭に加えて、位置パラメータリストの各要素をオーバーライドします。tee
次に、変更されたパラメータのリストを使用して呼び出します。