中かっこと変数拡張を1行に結合

中かっこと変数拡張を1行に結合

ファイル名を引数として使用し、標準出力をすべてのファイルにコピーするロギング機能が必要です。これまで私が思いついた内容は次のとおりです。

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次に、変更されたパラメータのリストを使用して呼び出します。

おすすめ記事