スクリプト自体を含むディレクトリからシンボリックリンクを介してシェルスクリプトを実行します。

スクリプト自体を含むディレクトリからシンボリックリンクを介してシェルスクリプトを実行します。

私の願いは、ディレクトリを変更してから実行することではありません。 jarファイルを使用していますが、それを実行する必要があります。だから私はこれを行うために非常に基本的なシェルスクリプトを書いています。

#!/bin/sh
java -jar TreeForm.jar

TreeForm次に代わりに保存しますTreeForm.sh。次に、次のようなシンボリックリンクを作成しました。

ln -s /opt/TreeForm/TreeForm /usr/bin/
chmod +x /opt/TreeForm/TreeForm

正常に作成されました。ただし、実行すると、JAVAで次のエラーが発生します。

間違い:jarfile TreeForm.jarにアクセスできません。

したがって、シェルスクリプトは、独自のディレクトリを実行しないか、そのディレクトリを調べることなく、代わりに現在のディレクトリで実行されているようです。現在のパスを変更したり、変数パスを追加せずにスクリプトファイルに関連するファイルを見つける方法TreeForm.jarはありますか?PATHそれとも、現在のパスではなくスクリプトパスを持つ変数はありますか?

ベストアンサー1

シェルは、ユーザーが指示しない限り、他のディレクトリには変更されません。スクリプトが別のディレクトリでコマンドを実行できるようにするには、cdスクリプト内で呼び出します。

スクリプトパスは次のように使用できます"$0"。スクリプトがシンボリックリンクの場合、これはシンボリックリンクへのパスです。シンボリックリンクの最終目標を取得するには、次を呼び出します。realpath(すべての最新のuniceで利用可能ですが、ほとんどは利用できません。Linux(GNUとBusyBox)、FreeBSD、およびSolaris 11では利用可能ですが、OSXでは利用できません。)

cd "$(dirname "$(realpath "$0")")"

realpathGNU coreutilsに比較的新しい追加エントリです。古すぎる場合は、readlink -f以前のバージョンを使用できます。 GNU以外のシステムでは、存在しない場合はrealpath存在できますが、readlink通常は最初のレベルのシンボリックリンクのみをチェックし、ほとんどの実装には完全な解決を実行するオプションはreadlinkありません。-f

おすすめ記事