심볼릭 링크를 찾기 위해 ‘realpath’를 얻으려면 어떻게해야합니까? 효과가 없습니다. 나는 사람들이 텍스트에 빠지지 않도록

저는 bash쉘로 MacOSX를 사용 하고 있습니다. 다음과 같이 만든 심볼릭 링크가 있습니다.

ln -s /usr/bin/python python2 

python2를 사용하는 패키지가 있으며 현재 작업 디렉토리에 /usr/bin/python실제로 python2 인 심볼 링크를 만들고 싶습니다 . python2명령 줄에서 수행 하면이 오류가 발생합니다.

python2: realpath couldn't resolve "/usr/bin/python2"

그러나 이와 같이 호출 ./python2하면 경로가 올바르게 해결됩니다. 내가 PATH.안에. 실제로 테스트를 위해 수정 .했습니다.

이 문제를 어떻게 해결합니까? 감사!


문맥

아래의 여러 제안 솔루션이 효과가 없습니다. 나는 사람들이 텍스트에 빠지지 않도록 가능한 한 집중적이고 간단한 질문을 시도했지만 분명히 더 많은 배경을 제공해야합니다.

git에서 복제 한 패키지를 개발하려고합니다. 원래 패키지 git-multimail는 Linux의 일부 변형에서 개발되었습니다 (우분투 추측). MacOSX에서 가능한 한 적은 수정으로 테스트 스위트를 사용할 수 있도록 수정하려고했습니다. 제안 된 솔루션 중 일부가 이상적이지 않은 이유는 다음과 같습니다.

  1. 루트 python2로 / usr / bin /에 심볼릭 링크를 만드십시오 . 이것을 필요로하지 않는 솔루션을 찾고 있습니다. 이것은 처음에는 명백한 옵션 이었지만 가능한 적은 호스트 시스템을 수정하는 솔루션을 원합니다. 그렇기 때문에 현재 작업 디렉토리에 임시 심볼릭 링크를 만들고 CWD (예 🙂 .를 경로에 추가 한 다음 완료되면 (예 : 심볼릭 링크)이를 삭제하려고했습니다.

  2. 래퍼 스크립트를 작성하여 기존 파이썬으로 파이썬 스크립트를 호출하십시오. 이것의 문제점은 많은 테스트 스위트가 정확한 실행 환경을 찾기 위해 shebang에 따라 실제 script_files를 실행 파일로 사용한다는 것입니다. 이것은 테스트 스위트를 상당히 편집하는 것을 의미합니다. 이러한 맥락에서 (테스트 프레임 워크의 스 니펫은 아래 참조) 모든 .py파일에 대해 래퍼를 추가해야 합니다. 또한 사용자 / 개발자는 사용중인 시스템에 따라 패키지를 사용하기위한 다른 규칙을 알고 있어야합니다 (예 : MacOSX에서는 래퍼를 통해 호출하거나 명시 적으로 호출하지 않고는 파이썬 파일을 사용하지 않아야합니다 /usr/bin/python file.py).

    #! /bin/sh
    
    D=$(cd $(dirname "$0") && pwd)
    MULTIMAIL="$D/../git-multimail/git_multimail.py"
    POST_RECEIVE="$D/../git-multimail/post-receive"
    
    TESTREPO=$("$D/create-test-repo")
    
    HOME="$D"
    XDG_CONFIG_HOME="$D"
    GIT_CONFIG_NOSYSTEM=1
    export HOME XDG_CONFIG_HOME GIT_CONFIG_NOSYSTEM
    
    cd $TESTREPO
    
    test_email() {
        REFNAME="$1"
        OLDREV="$2"
        NEWREV="$3"
        echo "$OLDREV" "$NEWREV" "$REFNAME" | USER=pushuser "$MULTIMAIL"
    
    } 
    
  3. 모든 변경 python2에 대한 참조를 python. README는 이것을 제안하지만, 실제로는 (의미 적으로) 그렇지 않을 때 시스템이 변경 사항을 새 버전으로 인식하기 때문에 버전 제어를 효과적으로 쓸모 없게 만듭니다.

나는 (3)을 사용했지만 더 나은 해결책을 찾으려고 노력하고 있습니다. 나는 이것이 상황과 같은 방식이라는 것을 기꺼이 받아들입니다 (즉, ‘python2’를 /usr/bin/python테스트 스위트 및 실제 프레임 워크에 대한 많은 변경없이 이식 가능하고 눈에 거슬리지 않음 을 가리키는 적절한 방법이 없습니다 ).



답변

심볼릭 링크를 해결 (또는 조사)해야하는 경우 플랫폼 독립 bash 라이브러리 ‘realpath-lib’를 사용할 수 있습니다. 기본적으로 readlink를 에뮬레이트하고 Mac 또는 Unix에서 작동합니다. Github 또는 Bitbucket 에서 찾을 수 있으며 무료입니다.

그러나 로컬 (작업) 디렉토리에서 ./python2 대신 python2를하고 싶은 것처럼 들립니다. .bashrc의 별칭 으로이 작업을 수행 할 수 있습니다. 그렇지 않으면 작업 디렉토리 (symlink가 포함되어 있음)를 PATH 환경 변수에 추가해야합니다. 현재 세션에서만 또는 향후 세션을 위해 .bashrc 파일 내에서 수행 할 수도 있습니다. 이것은 특정 사용자를위한 솔루션 일 수 있습니다.

모든 사용자에게 적용되는 또 다른 옵션은 경로의 다른 디렉토리 (예 : / usr / local / bin)에서 / usr / bin / python에 대한 python2 symlink를 작성하는 것입니다. 아마도 다음과 같습니다.

sudo ln -s /usr/bin/python /usr/local/bin/python2

그런 다음 모든 사용자 또는 스크립트가 python 또는 python2 명령을 찾아야합니다. 물론이 옵션을 설치하려면 관리자 (루트) 권한이 필요합니다.


답변

동일한 프로그램의 여러 버전을 관리하고 전환하기 위해 Apple 시스템을 사용하지 않고 있다고 생각합니다. 다음과 같은 스크립트를 사용하면 덜 우아하지만 문제없이 원하는 것을 달성 할 수 있습니다 python2.

#!/bin/bash
exec /usr/bin/python "$@"

실행 가능하게하고 ( chmod +x python2) 비즈니스에 종사하십시오.

문제 설명 :

를 실행 하면 동일한 디렉토리에서/usr/bin/python 찾아 실행 python2.7 합니다. 귀하의 심볼릭 링크는 시스템에 심볼릭 링크를 따르기 때문에 실패 /usr/bin후,을 찾고 찾는데 실패 python2 가. 심볼릭 링크 대신 “하드 링크”를 사용하여 한 단계 더 나아갈 수 있습니다.

rm python2
ln /usr/bin/python python2

이제 따라야 할 심볼릭 링크가 없으며 동일한 파일 (inode)의 두 파일 이름 만 있습니다. 그러나 이제 다음 메시지가 표시되지 않습니다.

python2: posix_spawn: /Users/alexis/.../python22.7: No such file or directory

참고 python22.7: 프레임 워크가 2.7생성 한 이름에 추가 되고 있습니다! 이를 풀고 예상과 일치하는 링크 포리스트를 설정하는 대신 버전 관리 프레임 워크를 벗어나서 위에서 제안한 솔루션을 사용하는 것이 좋습니다.

추신. 더 나은 해결책이있을 수 있습니다. 시작하기 위해 수행해야하는 작업을 설명하는 경우 (에 python2대한 별칭 으로 제공해야하는 이유 python) 누군가 다른 방법으로 작업을 수행하도록 도울 수 있습니다. 이것은 stackexchange lingo에서 “XY 문제”로 알려져 있습니다 …


답변

시험:

ln -s /System/Library/Frameworks/Python.framework/Versions/2.7/bin/python2.7 /usr/local/bin/python2


답변

Unix 명령 readlink을 사용하여 링크 물리적 경로를 찾을 수 있습니다 .

다음 링크가 있다고 가정 해보십시오.

$ ls -l /usr/bin/etags
lrwxrwxrwx. 1 root root 29 Dec 10 22:56 /usr/bin/etags -> /etc/alternatives/emacs.etags

$ ls -l /etc/alternatives/emacs.etags
lrwxrwxrwx. 1 root root 20 Dec 10 22:56 /etc/alternatives/emacs.etags -> /usr/bin/etags.ctags

$ ls -l /usr/bin/etags.ctags
lrwxrwxrwx. 1 root root 5 Dec 10 22:56 /usr/bin/etags.ctags -> ctags

  1. 심볼릭 링크가 가리키는 값을 찾으려면

    $ readlink /usr/bin/etags
    /etc/alternatives/emacs.etags

    참고 : 위의 결과는 다른 링크 일 수 있습니다. 이 문제를 해결하려면 아래 # 2를 참조하십시오.

  2. 심볼릭 링크가 가리키는 값의 절대 경로를 찾으려면

    $ readlink -f /usr/bin/etags
    /usr/bin/ctags

답변

이해가 안됩니다-래퍼 링크 가 정상 이라고 생각 하지만 래퍼 스크립트는 아닙니다 . 하나는 단지 간접적 인 수준입니다. 그리고 사용자에게 특정 디렉토리에서만 호출하도록 지시하지 않아도됩니까?

어쨌든 현재 작업 디렉토리를 얻을 수 있습니다 $PATH.

 echo "echo \"Hi! I'm python\"" >|./python
 chmod +x ./python
 PATH="${PWD}:${PATH}"
 python

 #OUTPUT#
 Hi! I'm python

 rm python
 python -V
 ln -s /usr/bin/python2 ./python
 python -V

 #OUTPUT#
 Python 3.4.0
 Python 2.7.6

 PATH="${PATH#"${PWD}:"}"
 python -V

 #OUTPUT#
 Python 3.4.0

을 (를) 받으십시오. 당신의 $PATH. 그건 끔찍한 생각입니다.


답변