程式在直接存取時運行,但在透過符號連結存取時不運行

程式在直接存取時運行,但在透過符號連結存取時不運行

我已經安裝了一個 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/wwanwwan/usr/bin在 中$PATH)時,場景以 不作為文件存在而開始/usr/bin/wwan並以 結束。/usr/bin/lib/wwan資產不在那裡。

詳細資訊可能有所不同,但符號連結的此類問題表明該工具在應該取消引用連結時沒有取消引用該連結。如果確實如此,它總是會/home/anp/tools/wwan像您運行一樣工作/home/anp/tools/wwan。我想說你所經歷的是一個錯誤。

解決這個問題的一種方法是改進工具本身(編輯其程式碼),以便它正確找到其真實路徑。

另一種方法是使用包裝腳本而不是符號連結。刪除符號連結並在名稱下方建立一個腳本/usr/bin/wwan。腳本內容:

#!/bin/sh
exec /home/anp/tools/wwan "$@"

使其可執行。現在,如果您調用/usr/bin/wwan,腳本將會exec執行/home/anp/tools/wwan,這將是該工具將使用的字串,因此它應該可以工作。您提供的所有(零個或多個)參數都/usr/bin/wwan將傳遞給/home/anp/tools/wwanthanks to "$@"

筆記:

  • /usr/bin/是可執行檔的系統範圍位置。從那裡連結到駐留在您的主目錄中的工具通常不是一個好的做法;包裝也一樣。
  • 包裝腳本是一個單獨的常規文件。它的所有權和權限獨立於目標可執行檔案的所有權和權限。將它們設定正確。

相關內容