次のように Ruby アプリケーションをインストールし/home/anp/tools
、シンボリック リンクを作成しました。
ln -s /home/anp/tools/wwan /usr/bin/wwan
を実行すると~/tools/wwan
、問題なく動作します。
シンボリックリンクから実行しようとすると、次のようなエラーが表示されます。
このようなファイルをロードできません -- lib/wwan
これはそのまま動作するのではないですか? プログラムが相対ファイル パスを解決しようとするときに、シンボリック リンクが問題を引き起こしていますか?
答え1
プログラムが相対ファイル パスを解決しようとするときに、シンボリック リンクが問題を引き起こしていますか?
そうかもしれません。この場合はおそらくそうなるでしょう。
実行した場合の考えられるシナリオ~/tools/wwan
:
- 殻が広がり
~
本当に走ります/home/anp/tools/wwan
。 - ツールが起動します。ツールはそれが
/home/anp/tools/wwan
(例えば、argv[0]
)。 - ツールは上記の文字列のディレクトリ部分を見つけ、自身の作業ディレクトリをその部分に変更します
/home/anp/tools/
。 - ツールは、相対パス を介して追加のアセットを参照します:
lib/wwan
。アセットは確かに にあるので/home/anp/tools/lib/wwan
、機能します。
しかし、/usr/bin/wwan
またはwwan
(/usr/bin
内にある$PATH
)を実行すると、シナリオは で始まり、がファイルとして存在しない/usr/bin/wwan
で終わります。アセットはそこに存在しません。/usr/bin/lib/wwan
詳細は異なる可能性がありますが、シンボリック リンクに関するこのような問題は、ツールがリンクを参照すべきときに参照解除していないことを示しています。参照解除している場合は、 を/home/anp/tools/wwan
実行した場合と同様に常に動作します/home/anp/tools/wwan
。発生した問題はバグであると言えます。
これに対処する 1 つの方法は、ツール自体を改善 (コードを編集) して、実際のパスが適切に検出されるようにすることです。
別の方法としては、シンボリックリンクの代わりにラッパー スクリプトを使用する方法があります。シンボリックリンクを削除し、 という名前でスクリプトを作成します/usr/bin/wwan
。スクリプトの内容は次のとおりです。
#!/bin/sh
exec /home/anp/tools/wwan "$@"
実行可能にします。 を呼び出すと/usr/bin/wwan
、スクリプトはexec
を実行し/home/anp/tools/wwan
、これがツールが使用する文字列となるため、動作するはずです。 に指定したすべての(0 個以上の)引数はにより/usr/bin/wwan
に渡されます。/home/anp/tools/wwan
"$@"
ノート:
/usr/bin/
は、システム全体の実行可能ファイルの場所です。そこからホーム ディレクトリにあるツールにリンクすることは、一般的には良い方法ではありません。ラッピングについても同様です。- ラッパー スクリプトは別の通常ファイルです。その所有権と権限は、ターゲット実行可能ファイルの所有権と権限とは独立しています。正しく設定してください。