やってみる

アウトプットすべく己を導くためのブログ。その試行錯誤すらたれ流す。

Bashインポート問題

 前回つくった奴の問題点を詳しく。

前回

. import lib.sh

 最低限のインポートができた。それはいいが、以下のような問題がある。

問題

  1. import自体を.(source)コマンドで読み込む必要がある
  2. 関数に名前空間がない
    • 例えば関数名はfuncのようになってしまう
    • dir.file.funcのようにできない
  3. インポートのルートディレクトリは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のような環境変数を用意してもいいかもしれない。要検討。

対象環境

$ uname -a
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l GNU/Linux