파일 추가, 화면 출력, stderr에서 리디렉션 모두 한 번에, 티가 필요하지 않습니다.

파일 추가, 화면 출력, stderr에서 리디렉션 모두 한 번에, 티가 필요하지 않습니다.

쉘 스크립트에서 명령을 실행하고 time dd있으며 결과를 파일로 출력하고 화면에 인쇄하고 싶습니다. 현재 실행 중인 라인은 다음과 같습니다.

(time dd of=$dest_filepath if=$src_filepath bs=$block_size count=$block_count) >> $log_file 2>&1 &

이로 인해 빈 파일이 남고 화면에 출력되지 않습니다. 이 세 가지를 이루려면 어떻게 해야 합니까?

저는 Busybox가 설치된 임베디드 시스템에서 이것을 실행하고 있습니다.포함되지tee그럼 중복은 아니지이 문제.

답변1

표시된 내용은 내 시스템에서 예상대로 작동합니다. bash대신 을(를) 사용하고 있습니까 sh? 어쨌든, 나는 와 를 사용해 dash보았고 거기에서도 작동했습니다. 그것이 없으면 유일한 해결책은 명령이 완료된 후라고 생각합니다.busyboxshteecat $logfile

busybox또 다른 가능성은 호출 에 대한 링크를 생성 tee하고 실행해 보는 것입니다. busybox내 데비안 버전은 이것을 지원하지만, 당신의 버전도 지원하는지 모르겠습니다:

ln -s /bin/busybox /bin/tee

tee그런 다음 정상적으로 실행 해 보십시오 .

정말로 그것을 얻을 수 없다면 tee, 유일한 다른 옵션은 다음과 같습니다:

foo=$( ( time dd if="file1" of="file2" bs=12 count=5 ) 2>&1 &)
echo "$foo"
echo "$foo" >> logfile

답변2

이 명령을 사용할 수 있습니다 tee. 여기서는 명령을 그룹화 time하고 dd코드 블록을 사용하여 단일 명령으로 처리하고 해당 출력을 쉽게 처리할 수 있도록 했습니다.

{ time dd of=$dest_filepath if=$src_filepath bs=$block_size count=$block_count; } 2>&1|tee $log_file

;두 번째 명령의 끝부분 을 기록해 두십시오 . 이는 코드 블록이 제대로 작동하는 데 필요합니다.

사용하고 싶지 않다면 tee이것을 고려할 수도 있습니다

{ time dd of=$dest_filepath if=$src_filepath bs=$block_size count=$block_count; } 2>&1 &> $log_file;cat $log_file

관련 정보