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


15

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

/myDirect/myFolder/myBash.bash

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

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


3
これは、スタックオーバーフローに適している可能性があります。これらの質問をチェックしてください:stackoverflow.com/questions/4774054/... stackoverflow.com/questions/59895/...
セトスII

1
使い方は?明確にしてください
Sergiy Kolodyazhnyy

1
@SethosIIこの質問は、ここでは全く話題にあり
Zanna

1
質問にコンテキストを追加しました。実行中のファイルのファイルパスを取得する簡単で明白なコマンドがあるかもしれないと思っていましたが、答えは少なくとも明白ではないようです。
dimpol

3
@Zanna私はそれがトピック外だとは言いません、私はそれがちょうどより適切であると思います、そして、すでにそこに何度も尋ねられて、答えられたリンクで示されるように。
セトスII

回答:


23

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

realpath "$0"

また、Serg指摘したdirnameように、次のようにファイル名を削除できます。

dirname "$(realpath $0)"

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

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

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

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

ノート

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

2
$0sed魔法の使用のために+1 。しかし、言ったsedときのようなツールの魔法が本当に不要であるdirnameが存在
Sergiy Kolodyazhnyy

2
あなたはすでに答えを持っています、使用realpathrealpath "$( dirname $0 )"私は個人的に使用しますreadlinkが、それは私です:readlink -e $(dirname $0)
Sergiy Kolodyazhnyy

@Serg:dirname "$(realpath "$0")"良くないでしょうか?通常、そのファイルを参照するシンボリックリンクの親ディレクトリではなく、参照されるファイルの親ディレクトリを知りたいと思うでしょう。
デビッドフォースター

4
@Serg "$(dirname "$(realpath "$0")")"は最も簡単な方法です。内部の引用$()は通常どおり機能します。
DepressedDaniel

@DepressedDaniel少しオンラインで調査しました、あなたは正しいです。$()サブシェルであると、外部に引用符を付けることができます。1つの実現がない限り、私は、しかし、それは簡単なようだと言うではないでしょう$()すべてのサブシェルある
Sergiy Kolodyazhnyy

5

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

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

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

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

whichPATH変数の一部であるディレクトリの1つにスクリプトが存在する場合により適しています。$0Zannaが示すように、スクリプト内から使用します。しかし、を使用するdirname代わりにを使用するため、あなたの答えは適切ですsed。したがって、そのために+1
Sergiy Kolodyazhnyy

5

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

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

/bin/pwdpwd組み込みコマンドとは対照的に、ディレクトリの実際のパスを出力します。


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

それはからの基準としているkenorbアンドロ
ありませんdirnameは、readlinkが、実パス、BASH_SOURCE
すべてが組み込みコマンドです

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.