zshでターミナルの出力を自動保存

スポンサーリンク
zshでターミナルの出力を自動保存 ノウハウ
zshでターミナルの出力を自動保存
この記事は約7分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、zshでターミナルの出力を自動保存する方法についてご紹介します。

スポンサーリンク

背景

ターミナルの出力を自動保存することにはいくつかのメリットがあります。

  1. バグのトラブルシューティング: ターミナルの出力は、プログラムの実行中に発生したエラーメッセージや警告、デバッグ情報を含んでいます。これらの情報を自動保存することで、バグのトラブルシューティングが容易になります。保存された出力を参照することで、プログラムの実行過程や問題の原因を特定しやすくなります。
  2. 履歴の保持: ターミナルの出力を自動的に保存することで、過去の作業やコマンドの履歴を保持できます。これにより、過去に実行したコマンドやその結果を再び参照したり、再利用したりすることができます。特に、複雑なコマンドや長い出力の場合、再入力する手間を省くことができます。
  3. ドキュメント作成やレポート作成: ターミナルの出力を保存することで、それをドキュメントやレポートに引用することができます。プログラムの実行結果や操作手順を記録する際に、保存された出力を参照することで正確な情報を提供できます。
  4. 実行ログの作成: ターミナルの出力を自動保存することで、実行ログを作成することができます。実行ログには、コマンドの実行時刻や結果、実行したコマンドの引数などが含まれます。これにより、作業の履歴やプログラムの実行状況を確認できます。

以上が、ターミナルの出力を自動保存することのメリットです。これらのメリットにより、作業の効率化やバグの特定、正確なドキュメント作成などが可能になります。

出力方法

出力方法は、scriptコマンドを使用して、~/.zprofile に処理を追加する形で実現しています。

下記の内容を ~/.zprofile に追記します。

# auto logging
record_dir="出力を保存したいディレクトリパス"
if [[ -e "${record_dir}" ]] then
  now=$(date "+%Y%m%d_%H%M%S")
  yyyy=${now:0:4}
  mm=${now:4:2}
  dd=${now:6:2}
  ww=$(date -j -f "%Y%m%d_%H%M%S" "${now}" "+%W")
  logging_dir=${record_dir}/${yyyy}/${mm}/w${ww}/${dd}/.scriptlog
  [ ! -e "${logging_dir}" ] && mkdir -p "${logging_dir}"
  logging_file=${logging_dir}/${now}.log
  script -a "${logging_file}"
fi

ターミナルを起動すると下記のような出力になれば成功です。

Last login: Mon May 15 20:15:09 on console
Script started, output file is 出力を保存したいディレクトリパス/2023/05/w20/17/.scriptlog/20230517_001018.log
% 

なので、今後は、COUNT(*) 関数を使用して、件数をとる方法にしたほうが良さそうです。

解説

scriptコマンド

scriptコマンドは、ターミナルのセッションを記録するために使用されるコマンドです。scriptコマンドを実行すると、その後のすべてのターミナルの出力が指定したファイルに保存されます。

以下は、scriptコマンドの基本的な使い方です:

script [オプション] [ファイル名]
  • オプション: scriptコマンドの動作を制御するためのオプションを指定します。よく使われるオプションには以下があります:
    • -a : 既存のファイルに追記します。
    • -c "コマンド" : 指定したコマンドを実行します。
    • -f : scriptが既に実行されている場合でも強制的に開始します。
    • -q : 冗長なメッセージを表示せずに実行します。
  • ファイル名: 出力を保存するファイルのパスと名前を指定します。省略した場合、デフォルトでtypescriptというファイル名が使用されます。

scriptコマンドを実行すると、新しいシェルが起動し、すべての出力が指定したファイルに保存されます。記録を終了するには、exitコマンドを入力するか、Ctrl-Dキーを押します。その後、scriptセッションは終了し、指定したファイルに保存されます。

scriptコマンドの使用例:

# 出力を保存するファイル名を指定してscriptを開始します
script mysession.txt

# コマンドや操作を行います
ls
cd mydirectory
echo "Hello, world!"

# `exit`コマンドまたはCtrl-Dを入力してセッションを終了します

# mysession.txtファイルにすべての出力が保存されます

scriptコマンドを使用すると、ターミナルの操作や出力を正確に記録し、後で確認したり文書化したりすることができます。

ソース

# auto logging
record_dir="出力を保存したいディレクトリパス"
if [[ -e "${record_dir}" ]] then
  now=$(date "+%Y%m%d_%H%M%S")
  yyyy=${now:0:4}
  mm=${now:4:2}
  dd=${now:6:2}
  ww=$(date -j -f "%Y%m%d_%H%M%S" "${now}" "+%W")
  logging_dir=${record_dir}/${yyyy}/${mm}/w${ww}/${dd}/.scriptlog
  [ ! -e "${logging_dir}" ] && mkdir -p "${logging_dir}"
  logging_file=${logging_dir}/${now}.log
  script -a "${logging_file}"
fi

このコードは、自動的にターミナルの出力を記録するためのスクリプトです。以下にコードの解説をします。

1行目: record_dirという変数に、出力を保存したいディレクトリのパスが指定されています。

3行目: record_dirが存在する場合にのみ、記録を開始します。-eは、ファイルやディレクトリが存在するかどうかをチェックする条件です。

5行目: 現在の日時を取得し、フォーマットを%Y%m%d_%H%M%S(例: 20230517_123456)に設定します。dateコマンドを使用しています。

6行目-9行目: 現在の日時から年、月、週、日を抽出します。nowの各部分をスライスして取得しています。

10行目: ログファイルのディレクトリパス(${logging_dir})を設定します。${record_dir}${yyyy}/${mm}/w${ww}/${dd}/.scriptlogを連結しています。

11行目: ${logging_dir}が存在しない場合、${logging_dir}を作成します。-pオプションは、親ディレクトリも含めてディレクトリを作成します。

12行目: ログファイルのパス(${logging_file})を設定します。${logging_dir}/${now}.logとなります。

13行目: scriptコマンドを実行してログ記録を開始します。-aオプションは、既存のファイルに追記するためのものです。${logging_file}に出力が保存されます。

このスクリプトでは、指定したディレクトリに年月週日の階層構造を持つログファイルを作成し、そこにターミナルの出力を追記しています。ターミナルセッションが終了すると、出力は指定されたディレクトリに保存されます。

おわりに

今日は、zshでターミナルの出力を自動保存する方法についてご紹介しました。

こういうことをする人がいるのかはわかりませんが、自分は過去の操作履歴を調査する用に残しています。historyコマンドもありますが、どういう出力だったかも合わせて知りたいときは、便利だったりします。とはいえ、あまり使用する機会はありませんが、いざというときにあってよかったと思えるものだと思います。秘匿情報も残ったりするので、そこは注意が必要です。

よっしー
よっしー

何か質問や相談があれば、遠慮なくコメントしてください。また、エンジニア案件についても、いつでも相談にのっていますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました