다음 데스크톱 항목이 있습니다.
[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 "$@"