シンボリックリンクからbashスクリプトを実行します。相対ディレクトリが機能するようにディレクトリを変更する方法

シンボリックリンクからbashスクリプトを実行します。相対ディレクトリが機能するようにディレクトリを変更する方法

状況について:

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

mycommandAKAは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"mycommandmycommand.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 "$@"

関連情報