📜

iniファイルの編集にはcrudini

2022/02/28に公開

おはこんばんにちわ

今日は私が愛用してるコマンドを備忘録兼ねて紹介しようと思います

いきなりですが皆さんはiniファイルって使ってますか?

Windows3.1位からWindows使ってると

あ〜あれね〜

ってなる人も多いと思いますが最近見かけることが少なくなりましたね

簡単に説明するとこんなやつです

[sectionA]
key1=value1
key2=value2

[sectionB]
key1=value1
key2=value2

見たらすぐわかりますが要するにKEY=VALUEを列挙したプロパティファイルを[〜]ってセクションで区切って複数定義出来るようにしたものです

もはやyamlとかtomlでええやんって感じなのでそういう人は特に読む必要は無いと思いますが一部のini愛好家のために私の愛用してるコマンドを紹介します

その名もcrudini

iniファイルに対してCRUD操作出来るからというわかりやすい命名をされたコマンドです
Ubuntu系ならapt一発で入りますし実態はpythonスクリプトなのでその他のOSでも容易に導入できます

https://www.pixelbeat.org/programs/crudini/

さて御託はいいので早速使ってみましょう

まずはCreateとUpdate

$ crudini --set /tmp/test.ini sectionA Key1 Value1
$ crudini --set /tmp/test.ini sectionA Key2 Value2
$ crudini --set /tmp/test.ini sectionB Key1 Value1
$ crudini --set /tmp/test.ini sectionB Key2 Value2

指定したファイルがなければCreateされます

そしてRead

$ crudini --get --format=ini /tmp/test.ini sectionA
[sectionA]
Key1 = Value1
Key2 = Value2
$ crudini --get --format=ini /tmp/test.ini sectionB
[sectionB]
Key1 = Value1
Key2 = Value2

ちょっと直感的じゃないんですがformat指定とセクションの指定をしないとcrudiniは指定した直下の情報しか返してくれません
なのでセクションを指定しないと

$ crudini --get --format=ini /tmp/test.ini
[sectionA]
[sectionB]

こんな感じで返します

とりあえず続いてDelete

$ crudini --del /tmp/test.ini sectionA key2
$ crudini --get --format=ini /tmp/test.ini sectionA
[sectionA]
Key1 = Value1

以上でCRUD操作を駆け足で説明しました

さて以上の使い方だけ見ただけだと

セクション毎にプロパティファイル複数作って読み込み分けたらええやん?

ってなると思います
ということで私はこれをどう使ってるのか?という説明をします

まず私がよくやるのはこんな感じの設定ファイルを作成するところから始めます

$ crudini --set /tmp/my.ini common common1 abc
$ crudini --set /tmp/my.ini common common2 def
$ crudini --set /tmp/my.ini hostA key ghi
$ crudini --set /tmp/my.ini hostB key jkl
$ sed -e '/^$/d' /tmp/my.ini 
[common]
common1 = abc
common2 = def
[hostA]
key = ghi
[hostB]
key = jkl

commonセクションが共通の設定でhostA,hostBが差分になります

で使うときはこんな感じ

$ echo $HOSTNAME
hostA
$ crudini --get --format=sh /tmp/my.ini common
common1=abc
common2=def
$ crudini --get --format=sh /tmp/my.ini $HOSTNAME
key=ghi
$ source <(crudini --get --format=sh /tmp/my.ini common)
$ source <(crudini --get --format=sh /tmp/my.ini $HOSTNAME)
$ echo $common1
abc
$ echo $common2
def
$ echo $key
ghi

--format=shをつけるとshell変数として定義出来る形式で出力されるのです
なのでsourceでその標準出力を読み取ることで共通設定のcommonセクションを読み込み
続いて実行されているホストによって読み込むkeyの値を変えて読み込みます

こうすることで実行環境によって差分が発生するような設定値を容易に定義出来るようになります
ターミナルで実行する分にはあまり効力わからないですがサーバ毎に微妙に設定値を変えないといけない設定ファイル等を読み込むようなスクリプトを作る際にはかなり便利です

まぁ今時サーバ毎に設定変えるなんて作りがなくなって来てると思いますが。。。

というわけでcrudiniの紹介と私の使い方でした

それではよいスクリプトライフを〜

とっぴんぱらりのぶぅ

P.S.

実際結構な数のサーバにそれぞれほぼ同じなのにサーバ毎に微妙に設定に差分があるという理由で悪夢のような設定ファイル群をもったゴミスクリプトを作った糞野郎の後始末をぶん投げられた事があります

どれくらい糞なのかというと

curlで一コマンド発行すれば済むところをperlでポート開いて手書きでhttpリクエスト送るライブラリ作ってシェルでそれ読み込んだりするみたいな感じの長大なシェルを作ってやがりました

僕「何故そんな面倒なことをしたの?」
糞「僕はPerl使えるからそれで実装したまでですcurl?wget?なにそれ美味しいの?」

って感じのそもそもWindowsしか触れないperl使いという奇行種だった事が判明し泣く泣くシェルを作り直して設定ファイルもcrudiniで1つにまとめるという作業をしましたがその頃からcrudiniは私の愛用コマンドになりました

そろそろ経歴書と本人のスキルが合致しない多重請負っぽい所からどこの誰かもわからない奴を送りつけてくる会社をどうにかしてくれんかな

ちなみにデフォルト値が欲しければcommonにkeyも定義しておけば定義してないhost名の環境ではデフォルト値で動きますがそこはそのアプリをフェールソフトに保つかフェールセーフに保つかの違いなのでお好みに任せます。

Discussion