쉘 스크립트가하는 모든 활동을 기록하는 쉬운 방법이 있습니까? echo “instructions”뿐만 아니라 다른 프로그램 출력도

쉘 스크립트에서 발생하는 모든 활동을 파일에 기록하는 쉬운 방법이 있습니까?

스크립트가 있습니다. echo “instructions”뿐만 아니라 다른 프로그램 출력도 출력합니다. 나는 명령을 알고있다 :

command | tee -a "$log_file"

command >> logifle.log

내가 묻는 것은 로깅을위한 쉘 매개 변수가 있는지 또는 내가 사용할 수있는 set 명령 또는 그와 비슷한 것입니다. 필연적으로 파일에 수십 개의 리디렉션 또는 티를 추가하고 싶지는 않습니다. 그래도 여전히 std 출력을 얻고 싶습니다-또한 로그를 원합니다. : wq



답변

일반적으로으로 스크립트를 실행하는 경우으로 스크립트를 foo.sh실행하십시오 (bash 스크립트라고 가정) bash -x foo.sh. 모든 것을 파일로 리디렉션하려면 시도하십시오 bash -x foo.sh > file.log 2>&1(stderr도 리디렉션하고 있습니다 2>&1. 원하지 않는 경우 제거하십시오 ). 진행 상황을 확인하려면을 (를) 참조하십시오 bash -x foo.sh 2>&1 | tee log.file.


답변

매우 쉽고 편리한 방법이 있습니다.

script터미널 세션의 타이프 스크립트 작성에 사용

  1. 명령을 시작하십시오 script

    file예를 들어 script ~/tmp/output, 인수 가 주어지면 script대화를이 파일에 저장합니다. 파일 이름을 지정하지 않으면 대화 상자가 파일에 저장됩니다typescript

  2. 스크립트를 시작하거나 원하는 것을 시작하십시오

  3. 스크립트가 완료되면 – script를 통해 중지CtrlD

  4. 기본 출력 파일에서 출력 확인 typescript


로 한 단계에서 명령을 시작하려면 script매개 변수를 사용하십시오.-c

-c COMMAND
    Run the COMMAND rather than an interactive
    shell. This makes it easy for a script to capture
    the output of a program that behaves differently
    when its stdout is not a tty.

셸을 포크하거나 새 셸을 시작 script하기 때문에 스크립트 내부 의 사용법은 의미가 없습니다 script.

SHELL 변수가 존재하면 스크립트에 의해 분기 된 쉘이 해당 쉘이됩니다. SHELL을 설정하지 않으면 Bourne 쉘이 사용됩니다. 대부분의 쉘은이 변수를 자동으로 설정합니다.