私の望みは、ディレクトリを変更して実行しないことです。私はjarファイルを使用しており、それを実行する必要があります。そのため、私はそれを行うための非常に基本的なシェルスクリプトを作成しました。
#!/bin/sh
Java -jar TreeForm.jar
次に、TreeForm.sh
ではなくTreeForm
として保存しました。次に、以下のようにシンボリックリンクを作成しました。
ln -s /opt/TreeForm/TreeForm /usr/bin/
chmod +x /opt/TreeForm/TreeForm
正常に作成されました。しかし、実行すると、Javaから以下のエラーが発生します。
エラー:jarfile TreeForm.jarにアクセスできません
したがって、シェルスクリプトは独自のディレクトリを実行しないか、そのディレクトリを調べないようですが、現在のディレクトリで動作します。 TreeForm.jar
のフルパスを指定してスクリプトファイルを変更したくありません。だから私は尋ねたかったのですが、現在のパスを変更したり、PATH
変数にパスを追加したりせずに、スクリプトファイルに関連するファイルを見つける方法はありますか?または、現在の変数ではなく、スクリプトのパスを持つ変数はありますか?
シェルは、指示されない限り、別のディレクトリに変更しません。スクリプトで別のディレクトリでコマンドを実行する場合は、スクリプトからcd
を呼び出します。
スクリプトへのパスは"$0"
として利用できます。スクリプトがシンボリックリンクの場合、それはシンボリックリンクへのパスです。シンボリックリンクの最終的なターゲットを取得する場合は、 realpath
を呼び出します(ほとんどのuniceでは使用できますが、Linuxでは使用できます(両方GNUおよびBusyBox)、FreeBSDおよびSolaris 11、ただしOSXは除く)。
cd "$(dirname "$(realpath "$0")")"
realpath
は、GNU coreutilsへの比較的最近の追加です。バージョンが古すぎる場合は、古いreadlink -f
を使用できます。GNU以外のシステムでは、 realpath
が存在しない場合はreadlink
が存在する可能性がありますが、通常は1レベルのシンボリックリンクのみを調べます。ほとんどのreadlink
の実装には-f
オプションがありません完全な解決を行うために。
シェルスクリプトが存在するディレクタは、その$0
パラメータから派生できます。たとえば、dirname
を使用して、スクリプト内でこれを行うことができます。
cd $(dirname "$0")
これは、jarファイルがスクリプトが置かれているのと同じディレクトリにあることを前提としています。
シンボリックリンクを介してスクリプトを参照する場合(さらに、スクリプトとjarファイルが同じディレクトリにあると仮定する場合)は、次のような複雑なスクリプトでこれを行うことができます。
$0
のパス名を見つけます(デフォルトの$PATH
ルックアップを使用する場合は簡単です)。readlink
などのプログラムを使用して、シンボリックリンクを読み取ります。これはPOSIXではありませんが、多くのLinuxシステムに存在します。readlink
がない場合は、他の回避策(ls
の出力の読み取りを含む)で可能です。cd
からthatの場所へのリンクを読みます。参考文献:
PATH=$PATH:/opt/TreeForm/
、次にexport PATH
変更を永続的にするには、2番目のポイントから.bashrcファイル(ユーザーのホームディレクトリ内)にコマンドを追加します。 (すべてのユーザーに対して)グローバルにしたい場合は、/etc/bash.bashrc
に追加します