파일 이름을 인수로 사용하고 표준 출력을 모든 파일에 복사하는 로깅 기능을 원합니다. 지금까지 내가 생각해낸 내용은 다음과 같습니다.
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
그런 다음 수정된 매개변수 목록을 사용하여 호출합니다.