실행 파일이 기호 링크를 통해 호출될 때 올바른 파일을 찾을 수 없습니다.

실행 파일이 기호 링크를 통해 호출될 때 올바른 파일을 찾을 수 없습니다.

다음을 사용하여 실행 파일에 대한 심볼릭 링크를 만들었습니다.

ln -s /usr/bin/mydir/myexec /usr/bin/myexec

Bash에서 실행하면 원본 의 디렉토리 myexec에 있는 적절한 파일이 로드되지 않습니다 .myexec

왜 이런 일이 발생하며 어떻게 해결할 수 있나요? 저는 Fedora 15 x64를 사용하고 있습니다.

답변1

상대 경로를 사용하여 호출되는 파일은 /usr/bin/mydir/myexec스크립트가 실행되는 현재 작업 디렉터리를 기준으로 검색됩니다. 아마도 현재 스크립트가 /usr/bin/mydir현재 실행되는 경우에만 작동할 것입니다.

이 문제를 해결하는 한 가지 방법은 포함된 파일에 절대 경로를 제공하는 것입니다(그러나 원하는 파일이 이동된 경우 스크립트를 업데이트해야 함). 또는 를 사용하여 절대 경로를 동적으로 파악해야 합니다. readlink예:

THISFILE=$(readlink -f -- "${0}")
THISDIR=${THISFILE%/*}
. "${THISDIR}/my_settings_file"
  • readlink -f심볼릭 링크의 대상을 반환합니다.
  • 그러면 마지막으로 제거된 부분, 즉 문제의 파일 경로를 ${THISFILE%/*}포함한 부분과 함께 심볼릭 링크의 대상이 반환됩니다 ./
  • ${THISDIR}이제 파일의 절대 경로가 포함되어 있으며 3행에서와 같이 사용할 수 있습니다.

나는 쉘 스크립트와 관련된 질문을 가정했습니다. 다른 언어에는 다른 방법이 있을 수 있습니다.


문제를 완전히 피하는 또 다른 방법은 경로의 바이너리를 심볼릭 링크하는 대신 /usr/bin/myexec다음을 포함하는 작은 스크립트를 만드는 것입니다.

#!/bin/sh
cd /usr/bin/mydir
./myexec

답변2

@daniel-anderson의 의견에 동의하지 않습니다. 나는 이러한 솔루션이 호출된 프로그램에 대한 인수를 적절하게 고려하지 않는다고 생각합니다. 거의 모든 실행 파일은 경로 인수를 현재 디렉터리를 기준으로 처리하므로 인수를 전달하는 것조차 작동하지 않습니다.

프로그램이 a에서 호출될 때 다르게 동작하는 유일한 경우는 symlink0번째 인수를 검사하는 경우입니다. 나는 심볼릭 링크를 사용하여 이 문제를 해결할 방법이 없다는 것을 알고 있습니다. 가장 간단한 해결 방법은 다음 형식으로 중간 셸 스크립트를 만드는 것입니다.

#!/bin/sh
/path/to/executable/that/needs/0th/argument/to/be/actual/path $@

어떤 기이한 이유로 실제 위치가 아닌 0번째 인수를 제공해야 하는 경우 다음과 같이 exec -a를 사용할 수 있습니다.

#!/bin/bash
(exec -a /path/to/executable/to/fool /path/to/fool/executable/with $@)

"-a" 인수는 엄밀히 말하면 POSIX 사양이 아닐 수 있으므로 특별히 bash를 사용했습니다. 경로에 ~/bin 폴더가 있다고 가정하면 첫 번째(일반) 사례는 다음과 같이 빠르게 수행될 수 있습니다.

echo -e '#!/bin/sh\n/path/to/executable $@' > ~/bin/shortcut
chmod 755 ~/bin/shortcut
shortcut

관련 정보