심볼릭 링크를 찾기 위해 'realpath'를 얻으려면 어떻게해야합니까?


13

저는 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테스트 스위트 및 실제 프레임 워크에 대한 많은 변경없이 이식 가능하고 눈에 거슬리지 않음 을 가리키는 적절한 방법이 없습니다 ).


1
야! Justln -s /usr/bin/python /usr/bin/python2
enedil

실제로 Linux에서 git-multimail을 개발합니다. 그러나 패치와 테스터가 OS X에서 작동하도록 환영합니다. BTW, git-multimail이 python2와 python3 :-)를 모두 허용하므로 "python2"문제가 해결되었습니다.
Matthieu Moy

확장 된 질문에는 여전히 중요한 세부 사항이 누락되었습니다. 실행 스크립트의 shebang 행은 어떻게 생겼습니까? 들어 git-multimail.py그것이 #!/usr/bin/env python2, 그래서이 작업을 수행하는 (상대적으로) 간단한 방법이있다.
Alexis

@enedil의 의견은 효과 ln -s /usr/bin/python2.7 /usr/local/bin/python2가 없었지만
Phylliida

답변:


3

심볼릭 링크를 해결 (또는 조사)해야하는 경우 플랫폼 독립 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 명령을 찾아야합니다. 물론이 옵션을 설치하려면 관리자 (루트) 권한이 필요합니다.


나는 결국 포기했다. 코드에 'python2'라고 가정하는 곳이 너무 많아서 모든 현지 솔루션이 모든 가능성을 다루지는 않습니다. 이것은이 손톱에 가장 적합한 망치입니다.
Avery Chan

@Avery, 당신은 내 솔루션을 시도 했습니까? 문제가 있었습니까? 추가 python2할 필요는 없었 습니다 /usr/bin(정확하게 개선으로 추가한다고 생각하지만).
Alexis

별칭 (...)으로이 작업을 수행 할 수 있습니다. 별칭은 스크립트가 아닌 명령 줄에만 영향을 미치므로 불가능합니다. Debian 7.5에서 기본 버전의 Python을 변경하는 방법을
Piotr Dobrogost

15

동일한 프로그램의 여러 버전을 관리하고 전환하기 위해 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 문제"로 알려져 있습니다 ...


를 실행 /usr/bin/python하면 동일한 디렉토리에서 python2.7을 찾아서 실행합니다. 이것은 매우 혼란스러운 진술입니다. /usr/bin/python심볼릭 링크가있는 경우를 설명하면 더 구체적으로하십시오.
Piotr Dobrogost

그것은 놀랍게도 ..
nicolas

놀랍게도 나쁜 것은 무엇입니까?
Alexis


1

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

0

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

어쨌든 현재 작업 디렉토리를 얻을 수 있습니다 $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. 그건 끔찍한 생각입니다.


.내 $ PATH에 왜 나쁜 생각입니까? 마지막에 넣으면 마지막으로 보이는 위치는 현재 작업 디렉토리입니다 (예 :`PATH = "$ {PATH} : $ {PWD}". 래퍼 스크립트 는 모든 파이썬 파일에 대해 python 실행 파일에 대한 래퍼 링크 는 내가 할 일을 하나 만듭니다
Avery Chan

@AveryChan 나는 그렇게 생각하지 않습니다. 랩퍼 스크립트는 실행 파일과 이름이 같은 쉘 함수 또는 별명을 소싱 할 수 있습니다. 또한 수 --bind mount하여 현재 디렉토리의 실행 파일 또는 (리눅스 만, 제 생각 엔)도 chroot필요에 따라. 그러나. in $PATH모든 디렉토리 에서 작동하며 구체적이지 않습니다. 이것은 사용자에게 위험합니다. 어쨌든 위의 방법을 매우 명확하게 보여주었습니다. 요구 사항을 충족하지 않습니까?
mikeserv
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.