프로그램은 직접 액세스할 때 실행되지만 심볼릭 링크를 통해 액세스할 때는 실행되지 않습니다.

프로그램은 직접 액세스할 때 실행되지만 심볼릭 링크를 통해 액세스할 때는 실행되지 않습니다.

Ruby 애플리케이션을 설치한 /home/anp/tools후 다음과 같이 심볼릭 링크를 만들었습니다.

ln -s /home/anp/tools/wwan /usr/bin/wwan

실행하면 ~/tools/wwan완벽하게 잘 실행됩니다.
심볼릭 링크에서 실행하려고 하면 다음과 같은 오류가 발생합니다.

해당 파일을 로드할 수 없습니다 -- lib/wwan

이대로 작동하면 안 되나요? 프로그램이 상대 파일 경로를 확인하려고 할 때 기호 링크로 인해 문제가 발생합니까?

답변1

프로그램이 상대 파일 경로를 확인하려고 할 때 기호 링크로 인해 문제가 발생합니까?

그럴 수도 있습니다. 이 경우일 가능성이 높습니다.

다음을 실행할 때 가능한 시나리오 ~/tools/wwan:

  1. 쉘이 확장 ~되고 실제로 실행됩니다 /home/anp/tools/wwan.
  2. 도구가 시작됩니다. 그것은 그것이 무엇인지 알고 있습니다 /home/anp/tools/wwan(예:argv[0]).
  3. 이 도구는 위 문자열의 디렉터리 부분을 찾아 자체 작업 디렉터리를 다음과 같이 변경합니다 /home/anp/tools/.
  4. 이 도구는 상대 경로( )를 통해 추가 자산을 참조합니다 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/실행 파일의 시스템 전체 위치입니다. 여기에서 홈 디렉터리에 있는 도구로 연결하는 것은 일반적으로 좋은 습관이 아닙니다. 포장도 마찬가지다.
  • 래퍼 스크립트는 별도의 일반 파일입니다. 소유권과 권한은 대상 실행 파일과 독립적입니다. 올바르게 설정하십시오.

관련 정보