Linuxコマンド結果をそのまま手順書っぽくmd形式出力

4 min読了の目安(約4100字TECH技術記事

構築作業において、プロンプトログはログとして良いですが、Markdownを利用し、もう少し見やすい形にも残せたらと考えました。

手順書というとハードルが上がってしまうかもしれませんが、実行するためのコマンド一覧(スクリプト)と出力結果を合わせて、見やすくしたものとなります。

コマンド実行結果を出来るだけ見やすくmd形式出力

はじめに

  • 目的

    • Linuxコマンド実行結果をそのまま手順書に近いmdファイルとして出力する(後で見返しやすいものとする)
  • 備考

    • bash実行
    • ワンライナーのコマンド実行を対象
    • 手順書 - Wikipedia
      • 手順書(てじゅんしょ)は、業務や作業を行う手順を文書化して、どの作業者でも同じ質の作業を実行することができるように、内容が明確化されたもの

事前知識

  • scriptコマンド
    • script コマンドの実行結果ファイルがデフォルトでtypescript
    • script 20201013.log等でファイルにアウトプット
    • オプション「-a」:同じファイルに追記
    • オプション「-c」:指定したコマンドの内容のみをログに記録
    • オプション「-f」:ログファイルへリアルタイム書き込み
    • オプション「-q」:ログ取得開始メッセージを非表示
~ # script --help

Usage:
 script [options] [file]

Make a typescript of a terminal session.

Options:
 -a, --append                  append the output
 -c, --command <command>       run command rather than interactive shell
 -e, --return                  return exit code of the child process
 -f, --flush                   run flush after each write
     --force                   use output file even when it is a link
 -q, --quiet                   be quiet
 -t[<file>], --timing[=<file>] output timing data to stderr or to FILE
 -h, --help                    display this help
 -V, --version                 display version
~ # eval --help
eval: eval [arg ...]
    Execute arguments as a shell command.

    Combine ARGs into a single string, use the result as input to the shell,
    and execute the resulting commands.

    Exit Status:
    Returns exit status of command or success if command is null.

テスト

  • 工夫ポイント

    • 実行結果として以下を表示
      • 実行プログラム
      • 実行スクリプト
      • 実行場所
      • 実行スクリプト内容出力
    • 実行コマンドをmd記載のコードエリア記載で挟む関数を作成
  • 準備ファイル

    • test.sh:テストしたいコマンド一覧ファイル
    • exe_md.sh:上記を実行し、Markdown記法で出力するファイル
~/work # ll
total 0
-rw-r--r-- 1 root root 452 Oct 13 22:53 exe_md.sh
-rw-r--r-- 1 root root  73 Oct 13 22:40 test.sh
~/work # cat test.sh
echo "HEELO"
for i in {1..3}; do echo $i; done
ls ERROR # For Error Test
~/work # cat exe_md.sh
#!/bin/bash

# script -fc 'bash exe_md.sh test.sh' output.md

function exe()
{
# exe command
echo '* `# '$@'`'
echo '```shell'
eval $@
echo '```'
}

echo '# 実行結果'
echo '## 実行プログラム'
echo $0
echo '## 実行スクリプト'
echo $1
echo '## 実行場所'
exe pwd
echo '## 実行スクリプト内容'
exe cat $1

echo '--------------------------------'

commmands=`cat $1`
while read line
do
  exe $line
done << FILE
$commmands
FILE
  • 実行コマンド
    • # script -fc 'bash exe_md.sh test.sh' output.md
      • Markdown記法での出力結果をファイルに出力
~/work # script -fc 'bash exe_md.sh test.sh' output.md
Script started, file is output.md
# 実行結果
## 実行プログラム
exe_md.sh
## 実行スクリプト
test.sh
## 実行場所
* `# pwd`
​```shell
/root/work
​```
## 実行スクリプト内容
* `# cat test.sh`
​```shell
echo "HEELO"
for i in {1..3}; do echo $i; done
ls ERROR # For Error Test```
--------------------------------
* `# echo "HEELO"`
​```shell
HEELO
​```
* `# for i in {1..3}; do echo $i; done`
​```shell
1
2
3```
* `# ls ERROR # For Error Test`
​```shell
ls: cannot access 'ERROR': No such file or directory
​```
Script done, file is output.md
  • 出力ファイル
    • output.md:実行結果をMarkdown記載としたもの
~/work # ll
total 4
-rw-r--r-- 1 root root 452 Oct 13 22:53 exe_md.sh
-rw-r--r-- 1 root root 612 Oct 13 23:16 output.md
-rw-r--r-- 1 root root  73 Oct 13 22:40 test.sh

以下、実行結果(output.md


Script started on 2020-10-13 22:52:00+0900

実行結果

実行プログラム

exe_md.sh

実行スクリプト

test.sh

実行場所

  • # pwd
/root/work

実行スクリプト内容

  • # cat test.sh
echo "HEELO"
for i in {1..3}; do echo $i; done
ls ERROR # For Error Test

  • # echo "HEELO"
HEELO
  • # for i in {1..3}; do echo $i; done
1
2
3
  • # ls ERROR # For Error Test
ls: cannot access 'ERROR': No such file or directory

Script done on 2020-10-13 22:52:00+0900