Shell-Script
*.desktop 和符號連結都有效(僅適用於這個文件)-Linux Mint 17.2 Cinnamon
我有這個桌麵條目:
[Desktop Entry] Name=dummy Type=Application Terminal=false Icon=/home/xyz/Software/Test/ico.png Exec= /home/xyz/Software/Test/start
它應該執行包含以下內容的文件:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./Linux/lib exec ./foo --gc=sgen
我試過創建符號連結,但結果是一樣的——它什麼都不做。當我點兩下它文件夾中的文件時,它會給我這樣的提示:
點擊後
Run
它執行良好,但是從桌面執行時…我已經嘗試將此路徑導出到 PATH,但是在執行時
foo
,它找不到一些庫,即使它應該很困難……而且路徑是 100% 正確的,因為圖示出現了它應該的樣子。我正在嘗試做的是創建
start
文件或foo
文件的工作桌面快捷方式(由於某種原因不會沒有錯誤地執行,我已經將它的路徑添加到PATH,執行時可能缺少參數’–gc = sgen’ ?)任何幫助將不勝感激!
問題是您在腳本中使用相對路徑:
./Linux/lib
,./foo
. 這些路徑是相對於目前目錄的。執行腳本的程序的目前目錄是啟動它的任何程序的目前目錄;它與腳本的位置無關。當您通過點擊桌面圖示執行腳本時,目前目錄是您的主目錄。一種解決方案是在腳本中添加一個
cd
命令,以更改到安裝應用程序的目錄。#!/bin/sh cd /home/xyz/Software/Test/ export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:./Linux/lib" exec ./foo --gc=sgen
但是不更改目前目錄,而是使用絕對路徑會更有用。例如,通過這種方式,您可以使用腳本打開目前目錄中的文件。在此過程中,我添加
"$@"
了對 的呼叫foo
,它將腳本命令行上的參數傳遞給應用程序。#!/bin/sh export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/home/xyz/Software/Test/Linux/lib" exec /home/xyz/Software/Test/foo --gc=sgen "$@"
如果腳本位於應用程序目錄中,則可以使其檢測自己的位置。
$0
是腳本的路徑。${0%/*}
是腳本的路徑,其中最後一個斜線被剝離後的所有內容,即包含腳本的目錄的路徑。#!/bin/sh foo_directory="${0%/*}" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$foo_directory/lib" exec "$foo_directory/foo" --gc=sgen "$@"
請注意,如果
LD_LIBRARY_PATH
最初為空,則您正在添加目前目錄,這可能不是一個好主意。你應該測試一下。#!/bin/sh foo_directory="${0%/*}" if [ -n "$LD_LIBRARY_PATH" ]; then export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$foo_directory/lib" else export LD_LIBRARY_PATH="$foo_directory/lib" fi exec "$foo_directory/foo" --gc=sgen "$@"
或(假設您不使用空條目
LD_LIBRARY_PATH
,這是一個明智的選擇)#!/bin/sh foo_directory="${0%/*}" export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:$foo_directory/lib" LD_LIBRARY_PATH="${LD_LIBRARY_PATH#:}" exec "$foo_directory/foo" --gc=sgen "$@"