Eu gostaria de ter uma função de log que levasse nomes de arquivos como argumentos e replicasse o stdout para todos esses arquivos. Isto é o que eu cheguei até agora:
function logger() {
exec > >(tee -ia /var/log/{log1,log2})
}
Quando tento substituir {log1,log2}
por {$*}
, recebo os argumentos separados por espaço. Então, pensei em fazer algo assim:
function logger() {
exec > >(IFS=,; tee -ia /var/log{"$*"}
}
Isso não faz o que eu quero, pois a expansão de chaves acontece antes de passar para a substituição de variável. Então, pensei que poderia fazer isso:
function logger() {
exec > >(IFS=,; eval "tee -ia /var/log/\{$*\}")
}
Mas isso se comporta da mesma forma, ou seja, logger one two
cria um único arquivo chamado {one,two}
.
Por que é que? Como posso fazer com que a expansão de chaves funcione para que tee
grave em vários arquivos?
Você não pode usar variável em uma expansão de chave em
bash
. Veja, por exemplo , como posso usar $variable em uma expansão de chave de shell de uma sequência?Se você não quiser chamar sua
logger
função comocom a função escrita como
então o que você poderia fazer é chamá-lo como
ou
e escreva a função como
ou mais curto (mas mais ou menos ilegível),
ou, se desejar,
Isso reescreve cada elemento da lista de parâmetros posicionais adicionando
/var/log/
ao início de cada um deles.tee
é então invocado com a lista de argumentos modificados.