我有这个桌面条目:
[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”?)
任何帮助将不胜感激!
答案1
问题是您在脚本中使用相对路径:./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 "$@"