Shell-Script

*.desktop 和符號連結都有效(僅適用於這個文件)-Linux Mint 17.2 Cinnamon

  • October 17, 2015

我有這個桌麵條目:

[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

我試過創建符號連結,但結果是一樣的——它什麼都不做。當我點兩下它文件夾中的文件時,它會給我這樣的提示:

http://1.bp.blogspot.com/-hfJadnx7lM8/T_qkxu6wanI/AAAAAAAABtM/TBiFSfVzJeg/s1600/2012-07-09-162344_514x187_scrot.png

點擊後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 "$@"

引用自:https://unix.stackexchange.com/questions/236883