* .desktop или symlink работает (только для этого одного файла) – 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 

Я попытался создать symlink, но результат тот же – ничего не делает. Когда я дважды щелкаю файл в его папке, он дает мне подсказку:

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 "$@"