
tee
출력을 파일에 복사하고 콘솔에 출력하는 데 사용할 수 있다는 것을 알고 있습니다 .
tee
그러나 스크립트의 모든 명령을 사용하거나 파이프를 사용하여 스크립트를 실행하지 않고는 (고정 템플릿과 같은) 쉘 스크립트를 준비하는 방법을 찾을 수 없는 것 같습니다 tee
.
tee
따라서 스크립트가 자동으로 호출하도록 하는 대신 파이프라인을 사용하여 매번 스크립트를 호출해야 합니다 .
수정된 shebang을 사용하여 파이프를 사용해 보았지만 성공하지 못했습니다. 이를 달성할 수 있는 방법을 찾을 수 없는 것 같습니다.
따라서 다음과 같이 스크립트를 호출하지 마십시오.
./myscript.sh |& tee scriptout.txt
다음과 같이 호출하여 동일한 효과를 얻고 싶습니다.
./myscript
물론 스크립트는 스크립트 내의 변수에 설정된 파일 이름을 알아야 합니다.
어떻게 해야 하나요?
답변1
스크립트 내용을 함수로 래핑하고 함수 출력을 다음으로 파이프할 수 있습니다 tee
.
#!/bin/bash
{
echo "example script"
} | tee -a /logfile.txt
답변2
를 사용하여 스크립트 시작 부분에 출력을 설정하는 것과 같은 작업을 수행할 수 있습니다 exec
. (아직 이에 대한 강력한 테스트를 수행하지 않았습니다.)
#!/bin/bash
# Split script output to stdout and to the logfile
exec 1> >(tee -a "/tmp/${0##*/}.log")
# Write a message
echo hello, world
# Empirical pause before exiting to wait for all output to get through the tee
sleep 1
exit 0
예를 들어, 스크립트가 호출되어 demo
다음을 사용하여 실행 가능하게 만들어졌다고 가정합니다 chmod a+x demo
.
ls -l /tmp/demo.log
ls: cannot access '/tmp/demo.log': No such file or directory
./demo
hello, world
cat /tmp/demo.log
hello, world