특정 라인의 stdout 및 stderr 리디렉션

특정 라인의 stdout 및 stderr 리디렉션

파일을 읽고 전체 출력을 파일로 리디렉션하고 있습니다. 특정 표현식의 stdout 및 stderr을 다음과 같이 화면으로 리디렉션하고 싶습니다(단지 예).

#!/bin/bash
OLDIFS=$IFS
while IFS='|'
while read fname fpath dname dpath ; do
echo "$fname" >> redirect to screen
echo "$fpath"
echo "$dpath"
diff "$fpath/$fname" "$dpath/$dname" >> redirect to screen
done > logfile

나는 그것을 시도했지만 >$(tty)성공하지 못했습니다. 이것도 작동하지 않습니다.

while read fname fpath dname dpath; do
echo "$fname" >&1
echo "$fpath"
echo "$dname"
echo "$dpath"
diff "$fpath/$fname" "$dpath/$dname" >&1
done > logfile

tee리디렉션되기 때문에 사용할 수 없습니다.모두화면으로 출력합니다. 이 목표를 어떻게 달성할 수 있나요?

답변1

while …; do
  echo "$fname" >&1
done > logfile

명령의 표준 출력은 echo표준 출력으로 리디렉션됩니다. 즉, >&1무작동(no-op)입니다. in은 신비하게 선택된 외부 범위가 아니라 이를 사용하는 명령의 파일 설명자 1을 1지정합니다 .>&1

외부 범위에서 사용 가능한 파일로 리디렉션하려면 해당 외부 범위에 파일 설명자를 복제하고 중복된 파일 설명자를 리디렉션하지 마세요.

while read fname fpath dname dpath; do
  echo "$fname" >&3
  echo "$fpath"
  echo "$dname"
  echo "$dpath"
  diff "$fpath/$fname" "$dpath/$dname" >&3
done 3>&1 >logfile

루프의 리디렉션 순서에 유의하세요. 먼저 파일 설명자 1(표준 출력)이 현재 위치한 곳에 파일 설명자 3이 생성되고, 그런 다음 파일 설명자 1이 다른 위치로 리디렉션됩니다.

또는 다른 설명자에서 로그 파일을 열 수 있습니다.

while read fname fpath dname dpath; do
  echo "$fname"
  echo "$fpath" >&3
  echo "$dname" >&3
  echo "$dpath" >&3
  diff "$fpath/$fname" "$dpath/$dname"
done 3>logfile

답변2

루프 while가 비대화형이므로 tty가 없습니다. 루프에 들어가기 전에 tty 장치를 저장해야 합니다. 그래서 당신은 다음과 같은 것을 얻게 될 것입니다 :

my_tty=$(tty)

while read fname fpath dname dpath ; do
  echo "$fname" | tee ${my_tty}
  echo "$fpath"
  echo "$dpath"
  diff "$fpath/$fname" "$dpath/$dname" | tee ${my_tty}
done > logfile

관련 정보