bashから現在のスクリプトの場所を取得します(例:python __file__変数)

bashから現在のスクリプトの場所を取得します(例:python __file__変数)

Bashでスクリプトのフルファイル名を取得するには? (Python変数に似ています__file__

それはまるで

#!/bin/bash
# my-script.sh

# would evaluate to /dir/my-script.sh
thisfile=$(get-name-for-this-script)

# Do something with some other local file 
cp $(dirname $thisfile)/something.txt .

答え1

sh などのシェルで$0スクリプトを実行するパス。これはbashの下に文書化されています。特殊パラメータ。これは相対パスである可能性があり、この場合、シェルの起動時に現在のディレクトリに相対的です。

$0あるスクリプトが別のスクリプトを使用または実行しても変更されません。現在実行中のコードを含むファイルを表すPythonに近いもの.source__file__$BASH_SOURCE。マニュアルは、トピックについてあまり明確ではありませんが、$BASH_SOURCE関数にないコードの場合でも、現在実行されている行を含むファイルの名前です。$0同様に$BASH_SOURCE相対パスにすることができます。これは.組み込みコマンドに渡されるすべてのパスで、cdシェルが後続のコマンドを実行しても変更されません。

答え2

ほとんどの答えは、相対パスを介してシンボリックリンクされたファイルを処理しない、単一のライナーではない、またはBSD(Mac)を処理しません。これら3つの問題の解決策は次のとおりです。

HERE=$(cd "$(dirname "$BASH_SOURCE")"; cd -P "$(dirname "$(readlink "$BASH_SOURCE" || echo .)")"; pwd)

まず、bashスクリプトディレクトリのcdの概念です。次に、ファイルを読み込み、リンクしてシンボリックリンク(相手または他のもの)であることを確認し、その場合はディレクトリに移動します。それ以外の場合は、現在のディレクトリに移動します(簡潔に保つ必要があります)。次に現在のディレクトリをエコーし​​ますpwd

オプションと同じ名前のディレクトリ関連の問題を避けるために、cdとreadlinkに引数を追加できますが、--ほとんどの場合は気にしません。

ここで写真と一緒に完全な指示を見ることができます(これは私のウェブサイトです)。

https://www.binaryphile.com/bash/2020/01/12/OK-the-location-of-your-script-in-bash.html

関連情報