やってみる

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

Bashでimportを再現する2(名前のプレフィクスにファイル名をつける)

 関数名をfile.funcのような名前にリネームする。

成果物

実行

git clone https://github.com/ytyaru/Shell.import.prefix.module.name.20200120000000
cd ./src
./main.sh
Called MyLib()
Called MyLibA()
Called MyLib2()

コード

  • sub/
    • lib2.sh
  • lib.sh
  • main.sh
  • moduled_import.sh

main.sh

. ./moduled_import.sh lib.sh sub/lib2.sh
lib.MyLib
lib.MyLibA
lib2.MyLib2

lib.sh

MyLib() { echo 'Called MyLib()'; }
MyLibA() { echo 'Called MyLibA()'; }

sub/lib2.sh

MyLib2() { echo 'Called MyLib2()'; }
  1. main.shでインポートする
  2. インポートした関数名にはプレフィクスがついている
    • プレフィクスは拡張子を除外したファイル名である

注意

  • import自体を.(source)コマンドで読み込む必要がある
  • 関数にディレクトリ名がない
    • 例えば関数名はfile.funcのようになってしまう
    • dir.file.funcのようにできない
  • インポートのルートディレクトリはimport呼出元ファイルが存在するディレクトリです

技術的ポイント

 関数名一覧。参考

"$(declare -F -p | cut -d " " -f 3)"

 環境変数を初期化したプロセスの作成。参考

env -i bash -c "commands..."

 関数名のリネーム。参考

RenameFunction() { # $1:old_func_name, $2:new_func_name
    declare -F "$1" > /dev/null || return 1
    eval "$(echo "${2}()"; declare -f ${1} | tail -n +2)"
    unset -f "$1"
}

所感

 次はディレクトリ名もプレフィクスに付与したい。

対象環境

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