"bin"にモジュラーbashスクリプトを追加するには?

"bin"にモジュラーbashスクリプトを追加するには?

sourceスクリプトをよりモジュール化するために使用するbashスクリプトがあります。binユーザーディレクトリにコピーする様子は次のとおりです。

/bin
    modules/
        script-1
        script-2
        script-3
        script-4
        script-5
    main-app

main-appただし、自分のディレクトリ以外のディレクトリで実行したい場合は機能しませんbin。これらのファイルを正しくインポートするためにsource ./modules/script-xinを使用する方法はありますか?それともファイルにmain-app変換する必要がありますか?main-app本当に必要な場合は手動で行う必要がありますか、または一種の「コンパイラ」を使用する必要がありますか?

答え1

使用$0位置パラメータとdirname:

#!/bin/bash

echo running "$(dirname "$0")/$(basename "$0")"
source "$(dirname "$0")/modules/script-1"

答え2

スクリプトの実際のパスを抽出してモジュールをインポートする必要があります。

#!/bin/bash

FULLPATH_OF_MAIN=`realpath $BASH_SOURCE`
SOURCEDIR=`dirname ${FULLPATH_OF_MAIN}`

source ${SOURCEDIR}/modules/script-x

答え3

.ディレクトリにドット()を使用すると、ドット "このディレクトリ"(pwd)に基づいています。

(ユーザーディレクトリ(〜)に相対的な)静的ディレクトリが気に入らない場合は、次のものを使用できます。

source ~/bin/modules/script-x     # or equivalent: . ~/bin/modules/script-x

デフォルトのアプリ起動ディレクトリ(すべてのディレクトリ)に関連するディレクトリが必要な場合は、bashで次のものを使用できます。

source "${BASH_SOURCE%/*}/modules/script-x"

または多くのシェルから:

source "$(basename "$0")/modules/script-x"

$0これは、psにリストされている名前にファイルへの正しいパスが含まれるようにデフォルトのアプリケーションが呼び出されると仮定すると機能します。しかし、必ずしもそうではありません。

$ exec -atestname /bin/bash
$ echo "$0"
testname

ディレクトリにリンクが含まれており、標準パス(リンク名または相手(..)名を使用せず)が必要な場合は、次のようにします。

source "$(basename "$(readlink -f -- "$BASH_SOURCE")" )/modules/script-x"

または(必要な場合)"$BASH_SOURCE"と交換してください。"$0"

注:即時いくつかの極端なケースrealpath実際に代わりに使用する必要があります。readlink -f

または、cd正しいディレクトリに移動してください(readlinkまたはrealpathを除く)。

source "$( cd "${BASH_SOURCE%/*}" > /dev/null && pwd )/modules/script-x"

関連情報