Bashインポート問題
前回つくった奴の問題点を詳しく。
前回
. import lib.sh
最低限のインポートができた。それはいいが、以下のような問題がある。
問題
import
自体を.
(source
)コマンドで読み込む必要がある- 関数に名前空間がない
- 例えば関数名は
func
のようになってしまう dir.file.func
のようにできない
- 例えば関数名は
- インポートのルートディレクトリは
import
呼出元ファイルが存在するディレクトリである
1. import
自体を.
(source
)コマンドで読み込む必要がある
Bashの言語仕様による問題。解決のしようがない。以下仕様が原因。
- 子プロセスで生成した名前は親プロセスに渡せない
よって対策としては親が子を自分自身の一部として読み込むしかない。それが.
(source
)である。
2. 関数に名前空間がない
lib.sh
func() { :; }
main.sh
. import lib.sh
func
- 上記の場合、関数名は
func
のようになってしまう dir.file.func
のようにできない
もし別ファイルに同じ名前の関数があればバッティングしてしまう。
対策として、モジュール名やディレクトリ名を関数名のプレフィクスとして付与することが考えられる。そんなことが可能なのか? 要調査。
3. インポートのルートディレクトリはimport
呼出元ファイルが存在するディレクトリである
そのプロジェクトやパッケージの内部ファイルを参照するなら問題ない。
だが、別のプロジェクトやパッケージのファイルを参照するときは困る。自分の位置からの相対パスで参照せねばならない。相対関係がないのに。
対策。共通APIパッケージ群があるルートディレクトリを設定しておき、そこからの相対パスで指定したい。ただし自分のパスをルートとしたときと区別できるようにすべき。
参考: pythonにおけるインポートパス
他の言語では、インポート用のルートパス変数を用意している。pythonだとsys.path
。
本import.sh
でもBASH_IMPORT_DIR
のような環境変数を用意してもいいかもしれない。要検討。
対象環境
- Raspbierry pi 4 Model B
- Raspbian buster 10.0 2019-09-26 ※
- bash 5.0.3(1)-release
$ uname -a Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux