모든 터미널 출력을 파일로 저장


61

모든 터미널 출력을 명령으로 파일에 저장하는 방법이 있습니까?

  • 나는 리디렉션에 대해 이야기하고 있지 않다 command > file.txt
  • 역사가 아니라 history > file.txt완전한 터미널 텍스트가 필요합니다.
  • 단축키가 아닙니다!

같은 것 terminal_text > file.txt


가능한 복제 , 어쨌든 감사합니다 :)
ABcDexter

많은 GUI 터미널 에뮬레이터는 스크롤 버퍼를 저장할 수 있지만 명령에 액세스 할 수는 없습니다 ( xdotool이와 같은 종류의 검은 예술은 남겨 둡니다 ).
카운터 모드

1
다음과 같이 터미널 메뉴-> 셸-> 다음과 같이 텍스트 내보내기를 시도하십시오. mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

답변:


70

사용할 수 있습니다 script. 기본적으로 해당 script세션 에서 터미널에 인쇄 된 모든 내용을 저장 합니다.

보낸 사람 man script:

script makes a typescript of everything printed on your terminal. 
It is useful for students who need a hardcopy record of an 
interactive session as proof of an assignment, as the typescript file 
can be printed out later with lpr(1).

터미널에 script입력하기 만하면 세션을 시작할 수 있습니다 script. 모든 후속 명령과 해당 출력은 모두 typescript현재 디렉토리에 이름이 지정된 파일에 저장됩니다 . 다음 script과 같이 시작하여 결과를 다른 파일로 저장할 수도 있습니다 .

script output.txt

screen세션에서 로그 아웃하려면 (내용 저장 중지)을 입력하십시오 exit.

예를 들면 다음과 같습니다.

$ script output.txt
Script started, file is output.txt

$ ls
output.txt  testfile.txt  foo.txt

$ exit
exit
Script done, file is output.txt

이제 파일을 읽으면 :

$ cat output.txt

Script started on Mon 20 Apr 2015 08:00:14 AM BDT
$ ls
output.txt  testfile.txt  foo.txt
$ exit
exit

Script done on Mon 20 Apr 2015 08:00:21 AM BDT

script또한 프로그램 메시지를 표시 / 저장하지 않고 조용히 실행 -q( --quiet) 하는 많은 옵션 이 있으며 세션 대신 특정 명령 -c( --command)을 실행할 수도 있으며 다른 옵션도 많이 있습니다. man script더 많은 아이디어를 얻으려면 확인하십시오 .


1
사실 후에 호출 할 수 있습니까? (예 : 세션이 끝났을 때) 또는 기록하려는 컨텐츠 전에 호출해야합니까?
목소리

@ tjt263 내용을 저장하기 전에 호출해야합니다.
heemayl

4
제길. 부끄러운 일입니다. 나는 보통 그 이후까지 그것을 원한다는 것을 모른다.
목소리

@ tjt263 .bashrc 안에 넣고 모든 것을 / tmp에 추가 할 수 있습니다.
phil294

1
소급하여 내보내려면 다음과 같이 터미널 메뉴-> 셸-> 다음과 같이 텍스트 내보내기를 시도하십시오. mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

12

나도 같은 문제에 직면하여 일부 해결책을 찾은 후에이 솔루션을 찾았습니다.

.bash_aliases에 다음을 추가하십시오.

# Execute "script" command just once
smart_script(){
    # if there's no SCRIPT_LOG_FILE exported yet
    if [ -z "$SCRIPT_LOG_FILE" ]; then
        # make folder paths
        logdirparent=~/Terminal_typescripts
        logdirraw=raw/$(date +%F)
        logdir=$logdirparent/$logdirraw
        logfile=$logdir/$(date +%F_%T).$$.rawlog

        # if no folder exist - make one
        if [ ! -d $logdir ]; then
            mkdir -p $logdir
        fi

        export SCRIPT_LOG_FILE=$logfile
        export SCRIPT_LOG_PARENT_FOLDER=$logdirparent

        # quiet output if no args are passed
        if [ ! -z "$1" ]; then
            script -f $logfile
        else
            script -f -q $logfile
        fi

        exit
    fi
}

# Start logging into new file
alias startnewlog='unset SCRIPT_LOG_FILE && smart_script -v'

# Manually saves current log file: $ savelog logname
savelog(){
    # make folder path
    manualdir=$SCRIPT_LOG_PARENT_FOLDER/manual
    # if no folder exists - make one
    if [ ! -d $manualdir ]; then
        mkdir -p $manualdir
    fi
    # make log name
    logname=${SCRIPT_LOG_FILE##*/}
    logname=${logname%.*}
    # add user logname if passed as argument
    if [ ! -z $1 ]; then
        logname=$logname'_'$1
    fi
    # make filepaths
    txtfile=$manualdir/$logname'.txt'
    rawfile=$manualdir/$logname'.rawlog'
    # make .rawlog readable and save it to .txt file
    cat $SCRIPT_LOG_FILE | perl -pe 's/\e([^\[\]]|\[.*?[a-zA-Z]|\].*?\a)//g' | col -b > $txtfile
    # copy corresponding .rawfile
    cp $SCRIPT_LOG_FILE $rawfile
    printf 'Saved logs:\n    '$txtfile'\n    '$rawfile'\n'
}

그리고 .bashrc 파일 끝에 다음을 추가하십시오.

smart_script

이 작업을 마치면 모든 터미널 세션에서 "script"명령이 한 번 실행되어 모든 것을 '~ / Terminal_typescripts / raw'에 기록합니다. 원하는 경우 'savelog'또는 'savelog logname'을 입력 하여 사실 이후 (세션 끝에서) 현재 세션 로그를 저장할 수 있습니다. 이렇게하면 현재 원시 로그가 '~ / Terminal_typescripts / manual'에 복사되고 읽을 수 있습니다. 이 폴더에 .txt 로그. (원시 로그 파일을 잊어 버린 경우에도 여전히 원시 로그 파일은 해당 폴더에 있습니다. 파일을 찾아야합니다.) 또한 'startnewlog'를 입력하여 새 로그 파일에 기록을 시작할 수 있습니다.

많은 정크 로그 파일이 있지만 오래된 로그 파일을 때때로 정리할 수 있으므로 큰 문제는 아닙니다.

( https://answers.launchpad.net/ubuntu/+source/gnome-terminal/+question/7131 , https://askubuntu.com/a/493326/473790 기반 )


로깅을 시작한 후 왜 'exit'명령이 필요한가요?
Danijel

Mac OSX의 .bash_profile에서 "script"명령을 호출하는 것이 쉘에 이상한 영향을 미치는 것 같습니다. 이것이 OSX에서 작동해야하는지 알고 있습니까?
Danijel
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.