⛳
Linuxコマンド結果をそのまま手順書っぽくmd形式出力
構築作業において、プロンプトログはログとして良いですが、Markdownを利用し、もう少し見やすい形にも残せたらと考えました。
手順書というとハードルが上がってしまうかもしれませんが、実行するためのコマンド一覧(スクリプト)と出力結果を合わせて、見やすくしたものとなります。
コマンド実行結果を出来るだけ見やすくmd形式出力
はじめに
-
目的
- Linuxコマンド実行結果をそのまま手順書に近いmdファイルとして出力する(後で見返しやすいものとする)
-
備考
- bash実行
- ワンライナーのコマンド実行を対象
-
手順書 - Wikipedia
- 手順書(てじゅんしょ)は、業務や作業を行う手順を文書化して、どの作業者でも同じ質の作業を実行することができるように、内容が明確化されたもの
事前知識
- scriptコマンド
- script コマンドの実行結果ファイルがデフォルトで
typescript
-
script 20201013.log
等でファイルにアウトプット -
オプション「-a」
:同じファイルに追記 -
オプション「-c」
:指定したコマンドの内容のみをログに記録 -
オプション「-f」
:ログファイルへリアルタイム書き込み -
オプション「-q」
:ログ取得開始メッセージを非表示
- script コマンドの実行結果ファイルがデフォルトで
~ # 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コマンド
- 文字列を評価、連結して実行(for文等もちゃんと実行)
- 【参考】【 eval 】コマンド――文字列を評価、連結して実行する:Linux基本コマンドTips(170) - @IT
~ # 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
Discussion