$ PATHに追加されたディレクトリの下に置かれたbashスクリプトファイルがあるので、任意のディレクトリからスクリプトを呼び出すことができます。
スクリプトと同じディレクトリの下に別のテキストファイルがあります。スクリプトでテキストファイルを参照する方法を教えてください。
たとえば、スクリプトがテキストファイルの内容を出力するだけの場合、cat textfile
は機能しません。別のディレクトリからスクリプトを呼び出すと、テキストファイルが見つかりません。
(パスの展開またはスクリプト自体に)シンボリックリンクがない限り、これらは同じように機能します。
MYDIR="$(dirname "$(realpath "$0")")"
MYDIR="$(dirname "$(which "$0")")"
上記のいずれかの2ステップバージョン:
MYSELF="$(realpath "$0")"
MYDIR="${MYSELF%/*}"
スクリプトへの途中にシンボリックリンクがある場合、which
はそのリンクの解決を含まない回答を提供します。 realpath
がデフォルトでシステムにインストールされていない場合は、 ここで見つけることができます 。
[EDIT]:realpath
はreadlink -f
よりも有利ではないようです Calebの提案 =、おそらく後者を使用する方が良いでしょう。私のタイミングテストは、それが実際に速いことを示しています。
私のシステムにはrealpath
がありません rozcietrzewiaczが推奨 。
これは、readlink
コマンドを使用して実行できます。これを解析which
または他のソリューションよりも使用する利点は、パスの一部または実行されたファイル名がシンボリックリンクであったとしても、実際のファイルがあったディレクトリを見つけることができるということです。
MYDIR="$(dirname "$(readlink -f "$0")")"
次に、テキストファイルを次のような変数に読み込むことができます。
TEXTFILE="$(<$MYDIR/textfile)"
スクリプト内の$0
はスクリプトへの完全パスであり、dirname
は完全パスを取得してディレクトリのみを提供するため、これをcat textfileに実行できます。
$ cat "$(dirname -- "$0")/textfile"
これをスクリプトの先頭に置くことができます:
cd "${BASH_SOURCE%/*}" || exit
BASH_SOURCE内部bash変数は、実際にはパス名の配列です。単純な文字列として展開すると、 "$ BASH_SOURCE"、最初の要素を取得します。これは、現在実行中の関数またはスクリプトのパス名です。
私はこれらを試してみましたが、realpathはうまくいきませんでした。私が行った解決策は:
SCRIPTDIR=$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
これまでのところうまくいきました。アプローチに潜在的な問題があるかどうか知りたいのですが。
私が使う:
#! /bin/sh -
dir=$(cd -P -- "$(dirname -- "$0")" && pwd -P) || exit
dosomethingwith "${dir%/}/some-file"
どちらがPOSIXであり、$0
のdirnameが改行文字で終わっておらず、-
でなく、$CDPATH
が設定されていない(そして おそらくいくつかのその他のコーナーケース スクリプトが$PATH
で検索されなかった場合)。
私は常にwhich
を使用して、PATHから実行可能ファイルの完全パスを見つけます。例えば:
which python
これをdirname
コマンドと組み合わせると、次のようになります。
wp=`which python`
dn=`dirname $wp`
ls $dn