grep과 같이 출력이 처리되는 명령이 주어지면 디버깅 목적으로 실제 출력이 로그 파일에 포함되기를 원합니다.
예를 들어, 다음과 같은 경우
useful=$(curl -s http://example.com/some/data | grep 'useful line')
echo "useful=$useful"
보고 싶어요
This page has a number of lines in it, but'
useful lines are the only ones I care about
except when something goes wrong and then
I'd really like to see what the heck was in
the output that grep consumed.
useful=useful lines are the only ones I care about
이것할 수 있는티셔츠는 이렇게 완성하세요
useful=$(curl -s http://example.com/some/data | tee /proc/$$/fd/1 | grep 'useful line')
echo "useful=$useful"
하지만stdout이 파일로 리디렉션되면 tee
로그 파일의 나머지 부분이 손상됩니다. tee -a
거의 같은 방식으로 실패합니다.
답변1
tee
stdout
제어 단말 장치 로의 흐름 /dev/tty
.
(
exec 1> >(tee -a stdout.log)
: > stdout.log
#var="$(echo -e "one\ntwo" | tee /dev/tty | grep one)"
var="$(echo -e "one\ntwo" | tee -a /dev/tty stdout.log | grep one)"
echo "var=$var"
)
cat stdout.log
# one
# two
# var=one
답변2
$var를 원하는지, 아니면 $var가 목적을 위한 수단일 뿐인지는 확실하지 않습니다. $var를 얻으려면 다음을 추가하세요.var="$(cat log)"
sed -nre 'p;/one/w log' <(echo -e "one\ntwo")
- --------(표준 출력)
하나 둘 - --------(로그)
하나
아니면 다음과 같은 뜻인가요?
sed -nre 'p;/one/w log' -e 's/one/logged: &/p' <(echo -e "one\ntwo")
- --------(stdout) 기록
1
:
하나 둘 - --------(로그)
하나
참고: sed의 명령은 스크립트가 실행될 때마다 w
덮어쓰여집니다 . log
물론 log
sed가 실행된 후에 기본 로그에 추가할 수 있습니다. 바라보다:sed 명령 요약
답변3
함수를 사용하면 안 되는 이유:
#!/bin/bash
logAndEcho () {
echo -e "$@" >> LOGFILE.txt
echo -e "$@"
}
var=$(logAndEcho "one\ntwo\nThis is a test"|grep one)
echo "var=$var"
그러면 전체 결과가 로그 파일로 전송된 다음 데이터가 표준 입력으로 에코되어 필요한 경우 이를 캡처할 수 있습니다.
답변4
sed는 이를 위해 설계되었습니다. 스트림 편집기입니다. 이는 귀하의 프로세스에서 티와 그렙을 대체할 수 있으며, 원할 경우 티와 결합하여 포크에 더 많은 타인을 추가할 수 있습니다. 어쨌든 직접 살펴보세요.
% sed '/useful/w ./useful.log' <<HDOC >>./notsomuch.log
> maybe useful
> definitely not
> ho-hum
> now this is useful
> HDOC
% cat ./useful.log
OUT> maybe useful
OUT> now this is useful
% cat ./notsomuch.log
OUT> maybe useful
OUT> definitely not
OUT> ho-hum
OUT> now this is useful