プログラムは直接アクセスすると実行されますが、シンボリックリンク経由でアクセスすると実行されません。

プログラムは直接アクセスすると実行されますが、シンボリックリンク経由でアクセスすると実行されません。

次のように Ruby アプリケーションをインストールし/home/anp/tools、シンボリック リンクを作成しました。

ln -s /home/anp/tools/wwan /usr/bin/wwan

を実行すると~/tools/wwan、問題なく動作します。
シンボリックリンクから実行しようとすると、次のようなエラーが表示されます。

このようなファイルをロードできません -- lib/wwan

これはそのまま動作するのではないですか? プログラムが相対ファイル パスを解決しようとするときに、シンボリック リンクが問題を引き起こしていますか?

答え1

プログラムが相対ファイル パスを解決しようとするときに、シンボリック リンクが問題を引き起こしていますか?

そうかもしれません。この場合はおそらくそうなるでしょう。

実行した場合の考えられるシナリオ~/tools/wwan:

  1. 殻が広がり~本当に走ります/home/anp/tools/wwan
  2. ツールが起動します。ツールはそれが/home/anp/tools/wwan(例えば、argv[0])。
  3. ツールは上記の文字列のディレクトリ部分を見つけ、自身の作業ディレクトリをその部分に変更します/home/anp/tools/
  4. ツールは、相対パス を介して追加のアセットを参照します: 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/は、システム全体の実行可能ファイルの場所です。そこからホーム ディレクトリにあるツールにリンクすることは、一般的には良い方法ではありません。ラッピングについても同様です。
  • ラッパー スクリプトは別の通常ファイルです。その所有権と権限は、ターゲット実行可能ファイルの所有権と権限とは独立しています。正しく設定してください。

関連情報