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

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

私の願いは、ディレクトリを変更してから実行することではありません。 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

答え2

引数からシェルスクリプトを含むディレクトリを派生させることができます$0。たとえば、dirnameスクリプトでは次のことができます。

cd $(dirname "$0")

jarファイルがスクリプトと同じディレクトリにあるとします。

シンボリックリンクを介してスクリプトを参照する場合(それでもスクリプトとjarファイルが同じディレクトリにあると仮定)、より複雑なスクリプトでこれを実行できます。

  • パス名を探します$0$PATHデフォルトのルックアップを使用する場合は簡単)。
  • readlinkシンボリックリンクの読み込みなどのプログラムを使用します。これはPOSIXではありませんが、多くのLinuxシステムに存在します。
  • がない場合は、readlink別の回避策があります(出力の読み取りを含むls)。
  • cdリンクをどう読んでも構いません。それ場所。

追加資料:

答え3

  1. シンボリックリンクの削除
  2. 実行:PATH=$PATH:/opt/TreeForm/その後export PATH

変更を永続的に適用するには、2 番目のポイントのコマンドを .bashrc ファイル (ユーザーのホーム ディレクトリにある) に追加します。グローバルに(すべてのユーザーに対して)必要な場合/etc/bash.bashrc

関連情報