[自作]コマンドログ用シェル

[自作]コマンドログ用シェル

今日の投稿はいつものNeural Network関連のものでは無く、全然別の話になります。

普段、このブログの内容はMacで作成しているのですが、そのMacにスリープからの立ち上がりが非常に遅い(10分以上かかることも!)という問題が発生しており、その修正作業を行うために色々とコンソールからコマンドを打とうと思ったのですが、いざコマンドを使おうと思った時にふと頭の中に「失敗した場合どうしようか?」という文字が横切りました。普通に考えればバックアップを作成しろよという話なのですが、面倒だったので入力したコマンドのログをとっておけば可逆的なコマンドを使用する限り、元に戻せるだろうと考えました(雑い)。そこでコマンドの記録を取ろうとしたのですが、teeコマンドを使用してもコマンドの出力を保存することはできても、コマンドの自体を保存できないという問題に当たってしまいました。私のMacやUnix歴は長くはないので、コマンドの出力結果だけではなんのコマンドでどのようなオプションを使用したのかがわかりません。そこで今回は自作のロギングコマンドを作成してみようと思い立ちました。

長くなりましたが、今回のロギングコマンドの内容は以下の4つです。

  • MacOS Mojaveで動く
  • コマンドの入力が引数ごと保存される
  • コマンド出力が保存される
  • コマンド入力時刻がわかる

この4点を踏まえて、bash(セキュリティガバ)で動くロギングコマンドを作成してみました。以下にプログラムとファイルのダウンロードリンクを置いておきます。もし使いたいという場合には自由に使ってくれて構いません。ただ、使用時に発生した問題は自己責任でお願いします。

#!/bin/sh

#作成者 怠惰人間
#作成日 2019/03/02
#メール taidahuman@gmail.com

#ログを保存する対話環境を提供するシェル
#カレントディレクトリの移動はできません
#多分対話環境の起動もできません
#"quit"で終了

#引数
# logging filename comment
# filename : ログを保存するファイル名
# comment  : ログファイルにコメントを付与
# filenameに"--help"を示した場合、使い方を表示

#引数で指定したファイルに追加書き込み形式でコマンドとその実行結果を記録する。
#入力例 : echo test

#出力例 : HH:MM:SS > echo test
#         test

#ログ出力先のファイルが定義されているか
if [ $# -lt 1 ];then
    #指定されていなければ終了
    echo "第一引数にログファイルまたは--helpを指定してください"
    exit 2
fi

#--helpが指定されていないかを確認
if [ $1 = "--help" ];then
    echo "logging filename comment"
    echo "filename : ログを保存するファイル名"
    echo "comment : ログに付与するコメント(任意)"
    exit 0
fi

#ログファイルの絶対パスを取得

# カレントディレクトリの絶対パスを取得
currentDir=$PWD

# ログファイルが格納されているディレクトリに移動
cd $(dirname $1)

# ログファイルの絶対パスを取得
logfile="$PWD/$(basename $1)"

# シェル起動時のカレントディレクトリに移動
cd $currentDir

#シェル開始時刻の記入
printf "[Command Start Time] : " >> $logfile
date >> $logfile

#comment引数の処理
if [ $# -ge 2 ];then
    echo "[Comments] : $2" >> $logfile
fi

#操作ディレクトリの表示
printf "[Current Directory] : " >> $logfile
pwd >> $logfile

#はじめの入力を取得
printf ">"
read inputKey

#対話環境用のループを生成 (入力inputKeyが\q以外でTrue)
while [ "$inputKey" != "quit" ]
do
    #コマンドをログに格納
    date +"%H:%M:%S" | tr \\r " " | tr \\n " " >> $logfile #改行コードをスペースに置換(Macは\r, Unixは\n)してリダイレクト
    echo "> $inputKey" >> $logfile

    #cdコマンドの場合には、bash内でcd処理を行う
    if [[ $inputKey =~ ^cd|^CD ]];then
        targetDir=$( echo $inputKey | egrep --only-matching " .*" )
    cd $targetDir
    else
    #コマンドを実行し、結果を表示するとともにログに格納
    $inputKey | tee -a $logfile
    fi
    
    #入力待ち
    printf ">"
    read inputKey
done

#シェル終了時刻の記入
printf "[Command End Time] : " >> $logfile
date >> $logfile

#ファイル末尾を改行
echo "" >> $logfile

使い方などを以下に示します。

使用準備

  1. このページの末端からファイルをダウンロードします
  2. ダウンロードしたファイルの内容がこのページに書いてあるものと同じか確認する
  3. ファイル名を自由に変更する
  4. ダウンロードしたファイルに実行権限を付与(chmod a+x ファイル名)
  5. echo $PATHを実行
  6. 5の出力結果のディレクトリの1つにファイルを移動

使用方法

<引数の配置>
ダウンロードしたファイル名 [ログを保存するファイル名] [コメント]
*コメントの付与は任意

<使用例>
ダウンロードしたファイル名がloggingなら
logging log.txt 初めてのログ取り!

注意事項

  • 使用は自由
  • 改造およびその配布可
  • 再配布可
  • バグがない保証はできません
  • 使用は自己責任で
  • ダウンロードファイルの文字コードはutf-8です

ダウンロードリンク

コマンドのログを取るシェルのダウンロード

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です