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