Lưu tất cả đầu ra của thiết bị đầu cuối vào một tập tin


61

Có cách nào để lưu tất cả đầu ra của thiết bị đầu cuối vào một tệp bằng lệnh không?

  • Tôi không nói về chuyển hướng command > file.txt
  • Không phải lịch sử history > file.txt, tôi cần văn bản đầu cuối đầy đủ
  • Không phải với phím nóng!

Cái gì đó như terminal_text > file.txt



Nhiều trình giả lập thiết bị đầu cuối GUI cho phép lưu bộ đệm cuộn, nhưng các lệnh này không thể truy cập được (bỏ qua một bên xdotoolvà loại nghệ thuật đen này).
phản ứng

1
Hãy thử menu Terminal -> Shell -> Xuất văn bản dưới dạng, như ở đây: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

Câu trả lời:


70

Bạn có thể sử dụng script. Về cơ bản nó sẽ lưu mọi thứ được in trên thiết bị đầu cuối trong scriptphiên đó .

Từ 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).

Bạn có thể bắt đầu một scriptphiên bằng cách chỉ cần gõ scriptvào thiết bị đầu cuối, tất cả các lệnh tiếp theo và đầu ra của chúng sẽ được lưu trong một tệp có tên typescripttrong thư mục hiện tại. Bạn cũng có thể lưu kết quả vào một tệp khác bằng cách chỉ bắt đầu scriptnhư:

script output.txt

Để đăng xuất screenphiên (dừng lưu nội dung), chỉ cần gõ exit.

Đây là một ví dụ:

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

$ ls
output.txt  testfile.txt  foo.txt

$ exit
exit
Script done, file is output.txt

Bây giờ nếu tôi đọc các tập tin:

$ 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

scriptcũng có nhiều tùy chọn, ví dụ như chạy lặng lẽ -q( --quiet) mà không hiển thị / lưu tin nhắn chương trình, nó cũng có thể chạy một lệnh cụ thể -c( --command) thay vì phiên, nó cũng có nhiều tùy chọn khác. Kiểm tra man scriptđể có thêm ý tưởng.


1
Nó có thể được gọi sau khi thực tế? (tức là vào cuối phiên) Hoặc nó phải được gọi trước khi nội dung bạn muốn đăng nhập?
tiếng nói

@ tjt263 Nó phải được gọi trước khi nội dung bạn muốn được lưu ..
heemayl

4
Chỉ trích. Thật là xấu hổ. Tôi thường không biết tôi muốn nó cho đến sau đó.
tiếng nói

@ tjt263 bạn có thể đặt nó bên trong .bashrc và nối mọi thứ vào / tmp.
phil294

1
Để xuất nó hồi tố, hãy thử menu Terminal -> Shell -> Xuất văn bản dưới dạng, như ở đây: mactricksandtips.com/2013/04/save-terminals-text-output.html
Magne

12

Tôi cũng phải đối mặt với cùng một vấn đề và sau khi một số tìm kiếm đã đưa ra giải pháp này:

Thêm vào .bash_aliases của bạn này:

# 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'
}

Và đến cuối tệp .bashrc của bạn thêm điều này:

smart_script

Sau khi bạn thực hiện điều này, lệnh "script" sẽ được thực thi một lần trong mỗi phiên cuối, ghi nhật ký mọi thứ vào '~ / Terminal_typescripts / raw'. Nếu bạn muốn, bạn có thể lưu nhật ký phiên hiện tại sau khi thực tế (vào cuối phiên) bằng cách nhập 'savelog' hoặc 'savelog logname' - điều này sẽ sao chép nhật ký thô hiện tại vào '~ / Terminal_typescripts / thủ công' và cũng có thể đọc được .txt đăng nhập vào thư mục này. (Nếu bạn quên làm như vậy, các tệp nhật ký thô sẽ vẫn nằm trong thư mục của họ, bạn sẽ chỉ phải tìm thấy chúng.) Ngoài ra, bạn có thể bắt đầu ghi vào tệp nhật ký mới bằng cách nhập 'startnewlog'.

Thỉnh thoảng sẽ có rất nhiều tệp nhật ký rác, nhưng thỉnh thoảng bạn có thể dọn sạch những tệp cũ, vì vậy đó không phải là vấn đề lớn.

(Dựa trên https://answers.launchpad.net/ubfox/+source/gnome-terminal/+question/7131 , https://askubfox.com/a/493326/473790 )


Tại sao bạn cần lệnh 'exit' sau khi bạn bắt đầu đăng nhập?
Danijel

Có vẻ như gọi lệnh "script" từ .bash_profile trên Mac OSX có một số hiệu ứng lạ trên shell. Bạn có biết nếu điều này sẽ làm việc trên OSX?
Danijel
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.