중첩된 bash 명령(괄호 안)의 내부 출력을 한 파일에 저장하고 외부 출력을 다른 파일에 어떻게 저장합니까?

중첩된 bash 명령(괄호 안)의 내부 출력을 한 파일에 저장하고 외부 출력을 다른 파일에 어떻게 저장합니까?

이것은 내 명령입니다:

(time ( \
   time sleep 1; \
   time sleep 2 \
) 2>&1 | tee inner.txt ) 2>&1 | tee outer.txt

cat inner.txt보여주다:

real    0m1.003s
user    0m0.001s
sys 0m0.002s

real    0m2.003s
user    0m0.001s
sys 0m0.002s

다음 cat outer.txt을 표시합니다.

real    0m1.003s
user    0m0.001s
sys 0m0.002s

real    0m2.003s
user    0m0.001s
sys 0m0.002s

real    0m3.068s
user    0m0.005s
sys 0m0.008s

이것을 어떻게 넣을 수 있나요 outer.txt? :

real    0m3.068s
user    0m0.005s
sys 0m0.008s

inner.txt더 좋은 점은 다음을 포함하는 , outer.txt, , 를 both.txt어떻게 얻을 수 있는지입니다 both.txt.

real    0m1.003s
user    0m0.001s
sys 0m0.002s

real    0m2.003s
user    0m0.001s
sys 0m0.002s

real    0m3.068s
user    0m0.005s
sys 0m0.008s

위에서 사용한 cmd 는 timebash 내장 함수입니다 time.아니요/usr/bin/time명령은 제가 여기 질문을 통해 배운 것입니다.time선택적 매개변수를 명령 에 전달하는 방법

저는 리눅스 우분투 18.04를 사용하고 있습니다.

이 질문은 해당 답변을 개선하기 위한 시도로 여기에 있는 내 답변에 대한 후속 조치입니다.bash에서 여러 줄, 여러 하위 명령 명령의 시간을 측정하고 선택적으로 모든 출력을 파일에 저장하는 방법

답변1

한편으로는 내부가 tee외부에 전원을 공급하고 있다고 생각합니다. 즉, tee표준 출력으로 인쇄하면 외부 수준의 다른 출력과 함께 외부 파이프로 리디렉션됩니다. 또한 내 Bash에서는 작동하려면 내부 괄호를 중괄호로 변경해야 했습니다(이유는 모르겠습니다).

이것은 파일로만 출력되는 것 같습니다.

(time { 
         time sleep 1;
         time sleep 2;
      } > inner.txt 2>&1
) > outer.txt 2>&1

출력을 파일과 터미널/스크립트의 표준 출력 모두로 출력하려면 외부 tee출력을 "둘러싸도록" 내부 출력을 정렬해야 합니다. 예를 들어, 스크립트의 표준 출력을 다른 무료 파일 설명자에 저장하고 다음 위치에 인쇄하세요.

exec 3>&1;

(time {
         time sleep 1;
         time sleep 2;
      } 2>&1 | tee inner.txt >&3
) 2>&1 | tee outer.txt >&3

( >&3외부적으로는 필요하지 않으며 대칭을 위해 수행했습니다. tee ... >/dev/tty(not 필수 exec)를 사용하여 터미널에 직접 인쇄할 수도 있지만 전체 스크립트 출력을 리디렉션하거나 파이핑하면 작동하지 않습니다.)

위와 같이 하면 myscript |tee both.txt3개의 출력 파일을 얻을 수 있습니다.

관련 정보