저장소에 저장된 일부 Python 스크립트가 있습니다. 일반 텍스트 파일이지만 실행 가능 비트가 설정된 경우 온라인 저장소 페이지에서는 해당 스크립트를 일반 텍스트 페이지가 아닌 바이너리로 다운로드합니다. 그러므로 나는 이 스크립트를 실행 불가능하게 만드는 편이 낫습니다.
그러나 나는 또한 그것을 사용하고 싶습니다. 원칙적으로는 다음과 같이 할 수 있습니다.
sudo ln -s /path/to/wherever/I/have/put/myscript.py /usr/bin/
...그런 다음 스크립트가 실행 가능하고 shebang이 있는 경우 명령줄에서 다음을 호출할 수 있습니다.
myscript.py [ARGS]
...그게 내가 원하는 거야. 그러나 스크립트 자체를 실행 가능하게 만들면 위에서 설명한 대로 저장소 다운로드 문제가 발생합니다. 또한 스크립트가 실행 가능하지 않을 때마다 추가 - 및 a를 사용하여 python
호출 해야 합니다 which
(그렇지 않으면 python
현재 디렉터리에서 파일을 찾습니다).
python `which myscript.py` [ARGS]
...아직도 타이핑이 너무 많아서 마음에 들지 않습니다. 또한 파일이 실행 불가능한 경우에는 ; my[TAB]
안에 있어도 /usr/bin
탭 완성 기능이 작동하지 않습니다. 작동 합니다 which
.
myscript.py
이제 대략적으로 말하자면, 심볼릭 링크에 대해 별도의 실행 권한을 가질 수 있다면 원래의 실행 불가능한 권한을 유지하면서도 명령줄을 통해 직접 실행할 수 있기를 바랍니다 . Mac OSX에서 가능한지 확실하지 않지만파일 권한은 심볼릭 링크에 어떻게 적용됩니까? - 루트Linux는 심볼릭 링크 자체의 권한이 아닌 원래 파일 권한만 고려하는 옵션을 전혀 제공하지 않습니다.
그래서 나는 알고 싶습니다:
- 이를 달성하기 위해 다른 유형의 링크(아마도 "하드 링크"?)를 사용할 수 있습니까?
- 기본적으로 심볼릭 링크와 유사한 것을 만들 수 있지만 자체 권한 세트를 제외하고 소스 코드와 동일한 복사본을 만들 수 있는 일종의 드라이버나 소프트웨어가 있습니까?
답변1
심볼릭 링크가 작동하지 않습니다. 두 파일 모두 동일한 권한을 가지므로 하드 링크(가능한 경우)도 작동하지 않습니다. 하지만 저는 다음과 같이 하려고 합니다. /usr/bin/myscript.py
스크립트를 연결하는 대신 스크립트 자체를 실행하는 쉘 스크립트를 작성합니다.
#!/bin/sh
exec python /path/to/wherever/I/have/put/myscript.py "$@"
인수를 전달하십시오 "$@"
. 스크립트가 인수를 허용하지 않는 경우 이 섹션을 안전하게 제거할 수 있습니다.
답변2
심볼릭 링크는 대상의 권한에 영향을 주지 않으며 커널이 자동으로 따르는 경로를 저장하는 방법일 뿐입니다. 실제로 많은 시스템은 심볼릭 링크에 대한 권한을 완전히 무시합니다.
하드 링크는 파일 시스템의 여러 위치에 동일한 파일(동일한 콘텐츠, 동일한 메타데이터(권한 포함))을 보유하는 방법이므로 도움이 되지 않습니다.
당신은 그것을 사용할 수 있습니다파일 시스템 바인딩파일이 다른 권한을 갖는 파일 시스템의 대체 보기를 만듭니다.
bindfs --perms=a+x /path/to/wherever/I/have/put ~/bin/wherever
이렇게 하면 대체 보기의 모든 파일이 실행 가능해집니다. 이는 귀하의 상황에서는 편리한 방법이 아닐 수 있지만 비슷한 문제를 겪고 있는 다른 사람들에게는 유용할 수 있습니다.
실제 해결책은 다운로드 시스템이 파일을 실행 가능하게 만들 수 있다는 가정하에 권한에 신경 쓰지 않도록 저장소 시스템을 수정하는 것입니다. 실패하면 다운로드한 후 파일에 대한 권한을 변경하기만 하면 됩니다.
#!/bin/sh
actual-download-command
chmod +x /path/to/wherever/I/have/put/*.py