$ PATHのスクリプトと同じディレクトリにあるファイルを参照します。

$ PATHのスクリプトと同じディレクトリにあるファイルを参照します。

すべてのディレクトリからスクリプトを呼び出すために、$ PATHに追加されたディレクトリにbashスクリプトファイルがあります。

スクリプトと同じディレクトリに異なるテキストファイルがあります。スクリプトでテキストファイルを参照する方法が疑問に思います。

たとえば、スクリプトがテキストファイルの内容のみを出力する場合、他のディレクトリからスクリプトをcat textfile呼び出すとテキストファイルが見つからないため機能しません。

答え1

パス拡張やスクリプト自体にシンボリックリンクがない限り、次は同じように機能します。

  • MYDIR="$(dirname "$(realpath "$0")")"

  • MYDIR="$(dirname "$(which "$0")")"

  • 上記の2段階バージョン:

    MYSELF="$(realpath "$0")"

    MYDIR="${MYSELF%/*}"

スクリプトにシンボリックリンクがある場合、そのwhichリンクの解決を含まない答えが提供されます。realpathシステムにデフォルトでインストールされていない場合ここで見つけることができます。

[編集する]:realpath特にメリットがないようだからreadlink -f ケイロップが提案する、後者を使用する方が良いかもしれません。私のタイミングテストでは、実際にはより速いことがわかりました。

答え2

realpath私のシステムにはありませんrozcietrzewiaczが提案したもの

コマンドを使用してこれを実行できますreadlink。解析や他のソリューションと比較して、このソリューションを使用すると、実行されたパスまたはファイル名whichの一部がシンボリックリンクであっても、実際のファイルを含むディレクトリを見つけることができるという利点があります。

MYDIR="$(dirname "$(readlink -f "$0")")"

これにより、テキストファイルを次の変数で読み取ることができます。

TEXTFILE="$(<$MYDIR/textfile)"

答え3

$0スクリプト内の内容はスクリプトのフルパスになり、フルパスをdirname使用してディレクトリのみを提供するので、catテキストファイルで次のことができます。

$ cat "$(dirname -- "$0")/textfile"

答え4

私はこれを試していますが、realpathは私には機能しません。私が採用したソリューションは次のとおりです。

SCRIPTDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )

これまではうまくいきました。このアプローチに潜在的な問題があるかどうか疑問に思います。

関連情報