web-dev-qa-db-ja.com

bashスクリプトを作成するときに、現在のファイルの場所の絶対パスを取得するにはどうすればよいですか?

myBash.bashというbashファイルがあるとします。次の場所にあります。

/myDirect/myFolder/myBash.bash

ここで、スクリプト内で文字列/myDirect/myFoldermyBash.bashの場所)を使用します。この場所を見つけるために使用できるコマンドはありますか?

編集:アイデアは、そのZipファイル内のbashスクリプトによって開始できるコードでZipフォルダを設定したいということです。私はそのZipファイル内のコードの相対ファイルパスを知っていますが、絶対パスは知っていません。それらが必要です。 1つの方法は、パスにハードコーディングするか、ファイルのパスを変数として指定することです。ただし、bash-fileがそれ自体の場所を把握し、Zip-fileの構造に関する知識から他のファイルへの関連パスを作成することが可能である場合、私は簡単だと思います。

11
dimpol

次のような完全なパスを取得できます。

realpath "$0"

そして Sergが指摘 のようにdirnameを使用して、このようにファイル名を削除できます

dirname "$(realpath $0)"

または、難しいファイル名での厄介な引用やワード分割を防ぐために

temp=$( realpath "$0"  ) && dirname "$temp"

それを解析することであった私の以前のアイデアよりもはるかに良い(私はもっと良い方法があると知っていた!)

realpath "$0" | sed 's|\(.*\)/.*|\1|'

ノート

  • realpathは、ファイルの実際のパスを返します
  • $0はこのファイルです(スクリプト)
  • s|old|new|oldnewに置き換えます
  • \(.*\)//の前の文字を保存して後で
  • \1保存された部分
17
Zanna

スクリプトがパスにある場合、次のようなものを使用できます

$ myloc=$(dirname "$(which foo.sh)")
$ echo "$myloc"
/path/to/foo.sh

編集:Sergからのコメントを読んだ後、これはスクリプトがパスにあるかどうかに関係なく機能する一般的な解決策かもしれません。

myloc==$(dirname "$(realpath $0)")
dirname "$myloc"
5

受け入れられた答えは完璧なようです。これを行う別の方法を次に示します。

cd "$(dirname "$0")"
/bin/pwd

pwd組み込みコマンドとは異なり、/bin/pwdはディレクトリの実際のパスを出力します。

4
serv-inc
wdir="$PWD"; [ "$PWD" = "/" ] && wdir=""
case "$0" in
  /*) scriptdir="${0}";;
  *) scriptdir="$wdir/${0#./}";;
esac
scriptdir="${scriptdir%/*}"
echo "$scriptdir"

kenorb および andro からの参照として使用されます
dirname、readlink、realpath、BASH_SOURCEなし
すべてがビルトインです

0