use*_*264 2 bash brace-expansion tee variable-substitution
我想要一个将文件名作为参数并将标准输出复制到所有这些文件的日志记录功能。这是我到目前为止提出的:
function logger() {
exec > >(tee -ia /var/log/{log1,log2})
}
Run Code Online (Sandbox Code Playgroud)
当我尝试用 替换{log1,log2}
时{$*}
,我得到了由空格分隔的参数。所以,我想我会做这样的事情:
function logger() {
exec > >(IFS=,; tee -ia /var/log{"$*"}
}
Run Code Online (Sandbox Code Playgroud)
这不能做我想要的,因为在继续进行变量替换之前发生了大括号扩展。所以,我想我可以这样做:
function logger() {
exec > >(IFS=,; eval "tee -ia /var/log/\{$*\}")
}
Run Code Online (Sandbox Code Playgroud)
但这行为相同,即logger one two
创建一个名为{one,two}
.
这是为什么?如何让大括号扩展工作以便tee
写入多个文件?
您不能在bash
. 参见例如如何在序列的 shell 括号扩展中使用 $variable?
如果您不想将您的logger
功能称为
logger /var/log/log{1,2}
Run Code Online (Sandbox Code Playgroud)
函数写成
logger () {
exec > >( tee -ia "$@" )
}
Run Code Online (Sandbox Code Playgroud)
那么你可以做的是称之为
logger log{1,2}
Run Code Online (Sandbox Code Playgroud)
或者
logger log1 log2
Run Code Online (Sandbox Code Playgroud)
并将函数写为
logger () {
for fname do
set -- "$@" "/var/log/$fname"
shift
done
exec > >( tee -ia "$@" )
}
Run Code Online (Sandbox Code Playgroud)
或更短(但或多或少不可读),
logger () {
set -- "${@/#//var/log/}"
exec > >( tee -ia "$@" )
}
Run Code Online (Sandbox Code Playgroud)
或者,如果你愿意,
logger () {
exec > >( tee -ia "${@/#//var/log/}" )
}
Run Code Online (Sandbox Code Playgroud)
这通过添加/var/log/
到每个元素的开头来重写位置参数列表的每个元素。 tee
然后使用修改后的参数列表调用。
归档时间: |
|
查看次数: |
80 次 |
最近记录: |