명령 출력을 파일(한 줄)로 보내기 전에 처리할 수 있나요?

명령 출력을 파일(한 줄)로 보내기 전에 처리할 수 있나요?

인수를 실행하고 결과를 파일로 출력하는 명령 처리 기능이 있습니다. 이제 파일을 입력하기 전에 이러한 명령의 출력을 처리해야 합니다.

요구 사항은 하나뿐입니다. echo "var is: $var"코드에서 추가로 사용될 결과를 표시해야 한다는 것입니다.

이는 내 요구 사항을 위반합니다."${@:1}" | perl -pe 's/\**//g' >> './test.log'

나는 다음과 같은 것을 상상한다:

"${@:1}" 1>> perl -pe 's/\**//g' >> './test.log'

하지만 작동하지 않습니다.

코드를 다음과 같이 단순화했습니다.

process() {
    "${@:1}" 1>>'./test.log'
}

process eval 'var=$(echo -e "*****ONE *****WORD"); echo -e "$var";'
echo "var is: $var"

현재 함수는 다음을 출력합니다.

 screen :"var is: *****ONE *****WORD"

 logfile:"*****ONE *****WORD"

.

원하는 결과:

 screen :"var is: *****ONE *****WORD" 

 logfile:"ONE WORD"

이 목표를 어떻게 달성할 수 있나요?

추신. Muru는 나에게 왜 eval을 사용하는지 물었습니다. 코드를 복제하지 않고 변수를 채울 수 있는 다른 방법이 없기 때문에 대답했습니다. 불행히도 그의 답변에 대한 토론은 삭제되었습니다.

답변1

이상한 이유로 변수를 설정하기 위해 여기에서 이를 사용하고 있으므로 eval파이프의 경우가 아닌 현재 셸에서 실행되어야 합니다. 따라서 프로세스 대체가 필요할 수 있습니다.

process () {
    "${@}" > >(perl ... >> test.log)
}

예를 들어:

$ process () {
 "${@}" > >(perl -pe 's/\**//g' >> test.log)
}
$ process eval 'var=$(echo -e "*****ONE *****WORD"); echo -e "$var";'
$ echo "var is: $var"
var is: *****ONE *****WORD
$ cat test.log
ONE WORD

관련 정보