$PATH에 공백이 있는 파일에 명령을 적용하는 방법은 무엇입니까?

$PATH에 공백이 있는 파일에 명령을 적용하는 방법은 무엇입니까?

내 $PATH에는 /a/path/with space/in/it가 있습니다.

해당 경로에 있는 실행 파일을 실행하려면 실행 파일 이름을 입력하기만 하면 됩니다.

그러나 명령을 적용하려고 하면 "찾을 수 없음" 오류와 함께 실패합니다.

예를 들어. 내 경로에 prog.py라는 Python 스크립트가 있습니다.

prog.py를 입력하면 쉘이 이를 실행하려고 시도합니다. 따라서 이 경로는 유효합니다. 하지만:

$ python3 prog.py

python3: can't open file 'prog.py': [Errno 2] No such file or directory

$ file prog.py

prog.py: cannot open `prog.py' (No such file or directory)

prog.py의 실제 위치로 이동한 다음 동일한 명령을 시도하면 예상대로 실행됩니다.

$ file ./prog.py

./prog.py: Python script, ASCII text executable

$ python3 ./prog.py

True

왜 이런 일이 발생합니까? 원하는 곳 어디에서나(특히 python3) 이러한 명령을 실행하려면 어떻게 해야 합니까?

답변1

이는 공백이 포함된 디렉터리 이름과 아무 관련이 없습니다. 상대 경로를 실행하거나 python3 prog.py지정 file prog.py하면 표준 Unix 의미 체계는 현재 작업 디렉터리에서 열리게 됨을 의미합니다. 이것을 바꾸는 합리적인 방법은 없습니다.

그러나 스크립트를 실행 가능하게 만들고( ) 맨 위에 올바른 줄이 있는지 chmod +x /path/to/prog.py확인하면 ( 아마도 ), ( 아님 )이라고 말하여 어디에서나 실행할 수 있습니다 .#!#! /usr/bin/python3prog.pypython3 prog.py

$PATH그런데, 일반적으로 프로그램이 구현을 지정하는 확장을 포함하지 않는 것이 좋습니다. 왜냐하면 이는 사실상 계층화 위반이기 때문입니다. prog대신에 (적절한 대체를 사용하여) 호출하는 것이 좋습니다 prog.py.

답변2

문제는 공간이 아니라고 생각합니다. 공백 없이 경로를 시도해 보셨나요?

핵심은 $PATH임의의 파일 유형이 아닌 실행 파일의 경로를 찾는 것입니다.

예를 들어, 누락된 라이브러리에 대해 불평하는 실행 파일이 있는 경우 $LD_LIBRARY_PATH파일이 . 파일 위치를 추가해도 $PATH도움이 되지 않습니다. 반면, 컴파일할 때 누락된 라이브러리가 발견되면 다른 변수(예 $LIBRARY_PATH: .

따라서 가장 좋은 해결책은 Python 스크립트에 적절한 shebang을 추가하고 $PATH필요할 때마다 가져올 수 있도록 하는 것 입니다 $PYTHONPATH.

답변3

prog.py파일을 참조하는 방법은 다음과 같습니다 .

python3 prog.py"현재 작업 디렉토리에 prog.py라는 파일이 있습니다"라고 말합니다.

두 번째 예 - 사용하는 곳 ./prog.py- "현재 디렉토리에서 prog.py라는 프로그램을 찾을 수 있습니다"라고 명시적으로 명시합니다.

$PATH는 인수가 아닌 명령에 대해서만 검색됩니다.

catPython 바이너리(또는 or sed또는 or ... 와 같은 다른 바이너리)를 호출하려면 less$PATH에 있어야 합니다. 다른 파일을 참조하려면 항상 파일에 대한 전체 상대 경로 또는 전체 절대 경로를 제공해야 합니다.

관련 정보