こんにちは、山田ハヤオです。シェルスクリプトにはライブラリが少ないです。
crudiniという、コマンドラインでINIファイルの解析や編集を行ってくれるPythonで書かれたツールがあるのですが、正直めちゃくちゃ遅いです。
Pythonだからなのかはわかりませんが、ちょっとでもループを回すとすぐに遅くなってしまいます。
今回、それを少しでも解消しようと互換性のあるライブラリと、それを使ったコマンドラインツールを開発したのでそれを紹介します。
Crshiniについて
Crudiniのシェルスクリプト実装なのでCrshiniです。
実際にINIファイルの解析を行うlibcrshiniと、それの実装例として作成したコマンドラインツールのcrshiniがあります。
あくまでメインはlibcrshiniです。
crshiniの使い方
インストール
まずはシステムにインストールします。
git clone https://github.com/Hayao0819/crshini
cd crshini
sudo make install
値を設定、変更する
値を設定するには以下の構文で使用します。
crshini --set [オプション] [ファイルへのパス] [セクション] [パラメータ] [値] --output 出力先
オプション部分で--stdin
とすることでINIファイルへのパスを省略して標準入力から受け取ることができます。
echo -n | ./crshini --set "Desktop Entry" "Exec" "true" --stdin
こんな感じで何もないところからINIファイルを組み立てることも可能です。
crshini –stdinを組み合わせることでINIファイルを構築することもできます(別の方法使ったほうが良いと思います)
値を取得する
値を取得するには以下の構文を使用します。
crshini --get [オプション] [ファイルへのパス] [セクション] [パラメータ]
セクション以下は省略することができます。
セクションを省略すると、セクションの一覧を。パラメータを省略するとパラメータの一覧を出力してくれます。
パラメータまですべて指定してある場合はそのパラメータの値が出力されます。
![](https://blog.fascode.net/wp-content/uploads/2021/06/image-23-1024x168.png)
libcrshiniの使い方
libcrshiniはシェルスクリプト内でsourceすることで使うライブラリです。
基本的な構文はcrshiniと一緒ですが、環境変数で挙動を変更します。
対応している環境変数
- _crshini_stdin (bool) 標準入力から受取る
- _crshini_debug (bool) デバッグメッセージを有効化する
- _crshini_output (string) 出力先のパスを指定する
- _crshini_temp (string) 一時ファイルのパスを指定する
上記の変数を設定することで挙動が代わります。
_crshini_get
値を取得する関数です。以下の構文で使用します。
_crshini_get [ファイルパス] [セクション] [パラメータ]
cat inifile | _crshini_stdin=true _crshini_get [セクション] [パラメータ]
_crshini_set
値を設定する関数です。以下の構文で使用します。
_crshini_set [ファイルパス] [セクション] [パラメータ] [値]
cat inifile | _crshini_stdin=true _crshini_set [セクション] [パラメータ] [値]
将来的に実装したい機能
将来的には複数のINIファイルをマージする機能や、ファイルを直接上書きする機能、ファイルの加工前にバックアップする機能などを実装する予定です。
実装の助けになったもの
上の解析コードをベースに開発を行いました。
grepやsedなどの基本的なコードとBashの組み込みコマンドしか使用していません。
また、Bashの変数展開には大いに助けられました。ありがとうございます()
![](https://qiita-user-contents.imgix.net/https%3A%2F%2Fcdn.qiita.com%2Fassets%2Fpublic%2Farticle-ogp-background-412672c5f0600ab9a64263b751f1bc81.png?ixlib=rb-4.0.0&w=1200&mark64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZ3PTk3MiZoPTM3OCZ0eHQ9JUUzJTgwJTkwJUUzJTgyJUI3JUUzJTgyJUE3JUUzJTgzJUFCJUU4JThBJUI4JUU0JUJBJUJBJUUzJTgxJUI4JUUzJTgxJUFFJUU5JTgxJTkzJUUzJTgwJTkxQmFzaCVFMyU4MSVBRSVFNSVBNCU4OSVFNiU5NSVCMCVFNSVCMSU5NSVFOSU5NiU4QiVFMyU4MSVBOCVFNyU5QyU5RiVFNiU5MSVBRiVFMyU4MSVBQiVFNSU5MCU5MSVFMyU4MSU4RCVFNSU5MCU4OCVFMyU4MSU4NiZ0eHQtYWxpZ249bGVmdCUyQ3RvcCZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTU2JnM9NzVlYjBlMWFjYWNkYjViMDc5ODZiNWFkNzIzNDAxYjE&mark-x=142&mark-y=57&blend64=aHR0cHM6Ly9xaWl0YS11c2VyLWNvbnRlbnRzLmltZ2l4Lm5ldC9-dGV4dD9peGxpYj1yYi00LjAuMCZoPTc2Jnc9NzcwJnR4dD0lNDB0X25ha2F5YW1hMDcxNCZ0eHQtY29sb3I9JTIzMjEyMTIxJnR4dC1mb250PUhpcmFnaW5vJTIwU2FucyUyMFc2JnR4dC1zaXplPTM2JnR4dC1hbGlnbj1sZWZ0JTJDdG9wJnM9OTgwMDJmZjA2YzgwNDNiZDc2MzRjMjhlOTVmZmIxM2I&blend-x=142&blend-y=436&blend-mode=normal&txt64=aW4g5pel6YmE44K944Oq44Ol44O844K344On44Oz44K65qCq5byP5Lya56S-&txt-width=770&txt-clip=end%2Cellipsis&txt-color=%23212121&txt-font=Hiragino%20Sans%20W6&txt-size=36&txt-x=156&txt-y=536&s=ef3f39914e2434f1c1c41739010d59a8)
ソースコード
ソースコードを公開しておきます。
最後に
Linuxはアプリケーションの情報がINIファイルで記述されているので、INIをシェルスクリプトで解析する機会も多いように感じます。
sedとgrepでゴリゴリ解析するよりも正確性があると思うのでこれからいろんな場所で使っていこうと思います。
1回の値の設定だけでもcrudiniよりcrshiniのほうがかなり早いので良かったと思っています。
Pythonより実行に依存しているパッケージも少ないですしね。
それでは、また今度。
コメント