状況について:
mycommand
という名前のシンボリックリンクがあります$PATH
。他の場所から呼び出されたファイルにリンクされますmycommand.sh
。このファイルには別のファイルが必要ですmycommand2.sh
。名前をつけます。
somedir
|-mycommand.sh
|-mycommand2.sh
./mycommand.sh
別のファイルを検索するには、直接実行してください。実行時にはそうではありませんmycommand
。理由:mycommand.sh
。./mycommand2.sh
すべての相対ディレクトリを絶対ディレクトリに変更せずにどのようにmycommand
機能できますか?
答え1
問題はシンボリックリンクのため発生しません。
mycommand.sh
呼び出されると、現在の./mycommand2.sh
作業ディレクトリは、somedir
コマンドの名前の指定または呼び出される方法とは関係ありません。chdir()
システムコールまたはcd
シェルに組み込まれているコマンドによって設定されるプロセス属性。
これにより:
cd /path/to/somedir
mycommand
mycommand
AKAはmycommand.sh
まだ./mycommand2.sh
現在のディレクトリにあります。
mycommand.sh
呼び出される作業ディレクトリに関係なくこれを見つけるには、mycommand2.sh
次のように変更する必要があります。
#! /bin/sh -
mydir=$(dirname -- "$0")
"${mydir%/}/mycommand2.sh"
または、mycommand.sh
作業ディレクトリが本当に必要な場合somedir
:
#! /bin/sh -
mydir=$(dirname -- "$0")
CDPATH= cd -P -- "$mydir" || exit
./mycommand2.sh
ここでasを呼び出すと、スクリプトのディレクトリ名ではなくシンボリックリンクのディレクトリ名が返されるため、mycommand
シンボリックリンクを使用すると問題が発生する可能性があります。dirname -- "$0"
mycommand
mycommand.sh
この問題を解決するには、次のように修正する必要がありますmycommand.sh
。
#! /bin/sh -
mydir=$(dirname -- "$(readlink -f -- "$0")")
"${mydir%/}/mycommand2.sh"
ここではreadlink -f
(標準コマンドではありませんが、一般的な)すべてのシンボリックリンクを解決します。これはmycommand.sh
、それ自体が別のディレクトリにあるスクリプトへのシンボリックリンクではないと仮定します。
スクリプトを変更できない場合、または変更する意思がない場合、他のアプローチはmycommand
スクリプト変えるシンボリックリンクこの方法:
#! /bin/sh -
cd /path/to/somedir &&
exec ./mycommand.sh "$@"