source
スクリプトをよりモジュール化するために使用するbashスクリプトがあります。bin
ユーザーディレクトリにコピーする様子は次のとおりです。
/bin
modules/
script-1
script-2
script-3
script-4
script-5
main-app
main-app
ただし、自分のディレクトリ以外のディレクトリで実行したい場合は機能しませんbin
。これらのファイルを正しくインポートするためにsource ./modules/script-x
inを使用する方法はありますか?それともファイルにmain-app
変換する必要がありますか?main-app
本当に必要な場合は手動で行う必要がありますか、または一種の「コンパイラ」を使用する必要がありますか?
答え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"