*.desktop이나 심볼릭 링크가 작동하지 않습니다(이 파일에만 해당) - Linux Mint 17.2 Cinnamon

*.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

심볼릭 링크를 만들어 보았지만 결과는 동일합니다. 아무 작업도 수행하지 않습니다. 폴더에 있는 파일을 두 번 클릭하면 다음과 같은 메시지가 표시됩니다.

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

클릭하면 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 "$@"

관련 정보