すべての端末出力をファイルに保存します


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
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」コマンドが1回実行され、すべてが「〜/ Terminal_typescripts / raw」に記録されます。あなたがしたい場合は、現在のセッションのログを保存することができ、実際の後 (セッションの終わりに)これは「〜/ Terminal_typescripts /手動」に、現在の生ログをコピーしても読める作成します- 「SAVELOG」または「SAVELOG LOGNAME」と入力しこのフォルダの.txtログ。(忘れた場合、生のログファイルはフォルダに残ります。それらを見つける必要があります。)また、「startnewlog」と入力して、新しいログファイルへの記録を開始することもできます。

大量のジャンクログファイルがありますが、古いファイルはときどき消去できるため、大きな問題ではありません。

(に基づいhttps://answers.launchpad.net/ubuntu/+source/gnome-terminal/+question/7131https://askubuntu.com/a/493326/473790


ロギングを開始した後に「終了」コマンドが必要なのはなぜですか?
ダニエル

Mac OSXで.bash_profileから「script」コマンドを呼び出すと、シェルに奇妙な効果があるようです。これがOSXで動作するかどうか知っていますか?
ダニエル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.