Ruby 애플리케이션을 설치한 /home/anp/tools
후 다음과 같이 심볼릭 링크를 만들었습니다.
ln -s /home/anp/tools/wwan /usr/bin/wwan
실행하면 ~/tools/wwan
완벽하게 잘 실행됩니다.
심볼릭 링크에서 실행하려고 하면 다음과 같은 오류가 발생합니다.
해당 파일을 로드할 수 없습니다 -- lib/wwan
이대로 작동하면 안 되나요? 프로그램이 상대 파일 경로를 확인하려고 할 때 기호 링크로 인해 문제가 발생합니까?
답변1
프로그램이 상대 파일 경로를 확인하려고 할 때 기호 링크로 인해 문제가 발생합니까?
그럴 수도 있습니다. 이 경우일 가능성이 높습니다.
다음을 실행할 때 가능한 시나리오 ~/tools/wwan
:
- 쉘이 확장
~
되고 실제로 실행됩니다/home/anp/tools/wwan
. - 도구가 시작됩니다. 그것은 그것이 무엇인지 알고 있습니다
/home/anp/tools/wwan
(예:argv[0]
). - 이 도구는 위 문자열의 디렉터리 부분을 찾아 자체 작업 디렉터리를 다음과 같이 변경합니다
/home/anp/tools/
. - 이 도구는 상대 경로( )를 통해 추가 자산을 참조합니다
lib/wwan
. 자산이 실제로 에 있으므로/home/anp/tools/lib/wwan
작동합니다.
/usr/bin/wwan
그러나 or wwan
( /usr/bin
에 있는 상태 에서) 을 실행하면 $PATH
시나리오는 파일로 존재하지 않는 것으로 시작 /usr/bin/wwan
하고 끝납니다 . /usr/bin/lib/wwan
자산이 없습니다.
세부 사항은 다를 수 있지만 기호 링크와 관련된 이러한 문제는 도구가 링크를 역참조해야 할 때 참조하지 않는다는 것을 나타냅니다. 만약 그렇다면, /home/anp/tools/wwan
마치 를 실행하는 것처럼 항상 작동할 것입니다 /home/anp/tools/wwan
. 나는 당신이 경험한 것이 버그라고 말하고 싶습니다.
이를 처리하는 한 가지 방법은 도구 자체를 개선(코드 편집)하여 실제 경로를 올바르게 찾는 것입니다.
또 다른 방법은 심볼릭 링크 대신 래퍼 스크립트를 사용하는 것입니다. 심볼릭 링크를 제거하고 이름 아래에 스크립트를 만듭니다 /usr/bin/wwan
. 스크립트 내용:
#!/bin/sh
exec /home/anp/tools/wwan "$@"
실행 가능하게 만드세요. 이제 를 호출하면 /usr/bin/wwan
스크립트는 exec
도구 /home/anp/tools/wwan
에서 작동하는 문자열이 되므로 작동할 것입니다. 에 제공한 모든(0개 이상의) 인수 는 에 /usr/bin/wwan
전달됩니다 ./home/anp/tools/wwan
"$@"
노트:
/usr/bin/
실행 파일의 시스템 전체 위치입니다. 여기에서 홈 디렉터리에 있는 도구로 연결하는 것은 일반적으로 좋은 습관이 아닙니다. 포장도 마찬가지다.- 래퍼 스크립트는 별도의 일반 파일입니다. 소유권과 권한은 대상 실행 파일과 독립적입니다. 올바르게 설정하십시오.