やってみる

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

Bashでimportを再現する6(複数ベースディレクトリパス対応)

 絶対パス相対パス(自分自身が存在するパス or $BASH_IMPORT_DIR)からインポートできるよう対応。

成果物

特徴

  • インポートするファイルのパスは以下3種類の方法で指定する
path root(base)
./a.sh import呼出元ファイルが存在するディレクト
a.sh $BASH_IMPORT_DIR
/tmp/a.sh /tmp
. import    ./a.sh
. import      a.sh
. import /tmp/a.sh
. ./import.sh 'di r/fi le.sh'
di-r.fi-le.func
  • 別名にできる
. ./import.sh dir/file.sh as LIB
LIB.func
. ./import.sh dir/file.sh as LIB.SUB
LIB.SUB.func
  • ファイルとディレクトリの名前の一部だけをプレフィクスにする
. ./import.sh A/B/C/D/E/F.sh -0
func
. ./import.sh A/B/C/D/E/F.sh -1
F.func
. ./import.sh A/B/C/D/E/F.sh -2
E.F.func
  • 一度に複数ファイルをインポートする(リネームはできない)
. ./imports.sh lib1.sh lib2.sh lib3.sh ...
lib1.func
lib2.func
lib3.func

実行

git clone https://github.com/ytyaru/Shell.import.base_path.2020012400000
cd ./src
./main.sh

importの準備

  1. moduled_import.shファイルをimportにリネームする
  2. importファイルが存在するディレクトリを環境変数PATHに通す

importの呼出例

  • /tmp/
    • lib.sh
  • /var/
    • lib.sh
  • repo/
    • main.sh
    • su b/
      • li b.sh

sub/lib.sh

Func() { echo 'Called su b/li b.sh Func()'; }

パス

 以下のようなパターンがある。

main.sh

. import /tmp/lib.sh
tmp.lib.Func
BASH_IMPORT_DIR='/var' . import /tmp/lib.sh
tmp.lib.Func
export BASH_IMPORT_DIR='/var' 
. import lib.sh
tmp.lib.Func
unset BASH_IMPORT_DIR
. import './su b/li b.sh'
su-b.li-b.Func

 パスに./がなくてBASH_IMPORT_DIRもなければ自分自身のファイルが存在するディレクトリパスをルートとする。

. import 'su b/li b.sh'
su-b.li-b.Func

リネーム

 以下のようなパターンがある。

. import 'su b/li b.sh'
su-b.li-b.Func
. import 'su b/li b.sh' as LIB
LIB.Func
. import 'su b/li b.sh' as LIB.SUB
LIB.SUB.Func
. import 'su b/li b.sh' -0
Func
. import 'su b/li b.sh' -1
li-b.Func
. import 'su b/li b.sh' -2
su-b.li-b.Func

前回まで

注意

  • import自体を.(source)コマンドで読み込む必要がある
  • ファイル内で定義した関数名や変数名を変更できない
    • 実装しないつもりである
  • 対応済みのスペース以外にもbashのメタ文字がある。$,(), {}, !, #, ", ', `, ~, \, ;。これらもハイフン化すべき
    • 一旦放置

所感

 とりあえず完成としておく。

対象環境

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