
すべてのディレクトリからスクリプトを呼び出すために、$ 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 )
これまではうまくいきました。このアプローチに潜在的な問題があるかどうか疑問に思います。