bash에서 스크립트를 실행할 때 ./
처음 에 작성해야합니다 .
$ ./manage.py syncdb
그렇지 않으면 오류 메시지가 나타납니다.
$ manage.py syncdb
-bash: manage.py: command not found
그 이유는 무엇입니까? .
현재 폴더의 별칭 이라고 생각 했으므로이 두 호출은 동일해야합니다.
또한 다음 ./
과 같은 응용 프로그램을 실행할 때 왜 필요하지 않은지 이해하지 못합니다 .
user:/home/user$ cd /usr/bin
user:/usr/bin$ git
(없이 실행 ./
)
답변
유닉스에서는 일반적으로 현재 디렉토리가에 없습니다 $PATH
.
명령을 입력하면 쉘은 PATH
변수 로 지정된 디렉토리 목록을 찾습니다 . 현재 디렉토리가 해당 목록에 없습니다.
해당 목록에 현재 디렉토리가없는 이유는 보안입니다.
루트이고 다른 사용자의 디렉토리로 이동하여 sl
대신에 유형을 입력한다고 가정 해 봅시다 ls
. 현재 디렉토리가에 있으면 PATH
쉘은 sl
다른 디렉토리가 없기 때문에 해당 디렉토리 에서 프로그램 을 실행하려고 시도합니다 sl
. 이 sl
프로그램은 악성 일 수 있습니다.
그것은 작동 ./
하기 때문에 POSIX가 지정 포함 명령 이름이 있음 /
에서 검색을 억제, 직접 파일 이름으로 사용됩니다 $PATH
. 동일한 효과를 위해 전체 경로를 사용할 수는 있지만 ./
더 짧고 작성하기 쉽습니다.
편집하다
그 sl
부분은 단지 예일뿐입니다. 디렉토리 PATH
는 순차적으로 검색되고 일치하는 경우 해당 프로그램이 실행됩니다. 따라서 모양에 따라 PATH
일반 명령을 입력하면 현재 디렉토리에서 프로그램을 실행하기에 충분하지 않을 수 있습니다.
답변
bash는 명령 행을 해석 할 때 환경 변수에 설명 된 위치에서 명령을 찾습니다 $PATH
. 그것을 보려면 다음을 입력하십시오.
echo $PATH
콜론으로 구분 된 경로가 있습니다. 보시다시피 현재 경로 .
는 일반적으로 없습니다 $PATH
. 따라서 Bash는 현재 디렉토리에 있으면 명령을 찾을 수 없습니다. 다음을 수행하여 변경할 수 있습니다.
PATH=$PATH:.
이 행은 현재 디렉토리를 추가하여 $PATH
다음을 수행 할 수 있습니다.
manage.py syncdb
그것은되는 하지 로,이 보안 문제를 가지고 권장, 플러스 당신은 이상한 행동을 할 수 있습니다 .
당신이있는 디렉토리에 따라 다름 :
기피:
PATH=.:$PATH
표준 명령을“마스크”하고 보안 위반의 문을 열 수 있습니다. 🙂
내 두 센트.
답변
쉘이 $PATH
환경 변수를보고 스크립트를 찾을 때 홈 디렉토리에있을 때 스크립트를 찾을 수 없습니다.
은 ./
‘에 지정된 모든 디렉토리에서 내 스크립트의 현재 디렉토리에보기보다는보고를 말한다 $PATH
‘.
답변
‘.’를 포함하면 본질적으로 실행 가능한 bash 스크립트에 “전체 경로”를 제공하므로 쉘은 PATH 변수를 확인할 필요가 없습니다. ‘.’없이 쉘은 PATH 변수를 찾습니다 ( echo $PATH
입력 한 명령이 PATH의 폴더에 있는지 확인하기 위해 실행 하여 볼 수 있습니다 . manage.py의 경우와 같이). PATH에 현재 디렉토리를 포함시키는 것은 좋지 않은 것으로 간주됩니다. http://www.faqs.org/faqs/unix-faq/faq/part2/section- 13.html
답변
* nix에서 Windows와 달리 현재 디렉토리는 일반적으로 $PATH
변수에 없습니다 . 따라서 명령을 실행할 때 현재 디렉토리가 검색되지 않습니다. ./
이러한 응용 프로그램 은 $ PATH에 있으므로 응용 프로그램을 실행할 필요가 없습니다 . /bin
또는에 있을 가능성이 높습니다 /usr/bin
.
답변
이 질문에는 이미 멋진 답변이 있지만 실행 파일이 PATH에 있고 실행할 때 매우 다른 출력을 얻는다면 추가하고 싶습니다.
./executable
당신이 실행하면 얻을 사람에게
executable
(하나가 아닌 다른 오류 메시지가 표시되는 경우) 문제는 컴퓨터에 두 가지 버전의 실행 파일이 있다는 것입니다. 하나는 경로에 있고 다른 하나는 그렇지 않습니다.
실행하여 이것을 확인하십시오
어느 실행 파일
과
whereis executable
문제가 해결되었습니다 … 실행 파일의 세 가지 버전이 있는데 그 중 하나만 환경에 맞게 올바르게 컴파일되었습니다.
답변
의 근거 /
POSIX PATH 규칙의
규칙은 bash에서 실행하기 위해 실행 파일 또는 스크립트 이름 앞에 ./ (점 슬래시)가 필요한 이유는 무엇입니까?하지만 왜 이것이 좋은 디자인이라고 생각하는지 자세히 설명하고 싶습니다.
먼저 명시적인 정식 버전은 다음과 같습니다.
- 경로가 포함되어있는 경우
/
(예를 들어./someprog
,/bin/someprog
,./bin/someprog
) : CWD를 사용하고, PATH는 아니다 - 경로에
/
(예someprog
:)가 포함되지 않은 경우 : PATH가 사용되고 CWD가 없습니다
이제 다음을 실행한다고 가정하십시오.
someprog
검색 :
- CWD를 기준으로
- 이후 PATH와 관련
그런 다음 /bin/someprog
배포판에서 실행하려면 다음을 수행 하십시오.
someprog
때로는 작동하지만 다른 관련없는 someprog
프로그램 이 포함 된 디렉토리에있을 수 있기 때문에 실패 할 수도 있습니다 .
따라서, 이것이 신뢰할 수 없다는 것을 곧 알게 될 것이며, PATH를 사용하려고 할 때 항상 절대 경로를 사용하게되어 PATH의 목적을 상실하게됩니다.
PATH에 상대 경로를 갖는 것이 정말 나쁜 이유이기도합니다. 당신을 보고 있습니다node_modules/bin
.
반대로, 다음을 실행한다고 가정하십시오.
./someprog
검색 :
- PATH를 기준으로
- 이후 CWD 기준
그런 다음 방금 someprog
git 저장소에서 스크립트 를 다운로드하고 CWD에서 스크립트 를 실행하려는 경우 배포판에 다음이 있기 때문에 이것이 실제로 실행될 프로그램인지 확신 할 수 없습니다.
/bin/someprog
작년 크리스마스 이후에 술을 너무 많이 마신 후 설치 한 일부 패키지의 경로입니다.
따라서 다시 한 번, CWD를 기준으로 항상 로컬 스크립트를 실행하여 전체 경로를 사용하여 실행중인 것을 알 수 있습니다.
"$(pwd)/someprog"
그것은 또한 매우 성가시다.
당신이 생각해보고 싶은 또 다른 규칙은 다음과 같습니다.
상대 경로는 PATH 만 사용하고 절대 경로는 CWD 만 사용합니다.
그러나 다시 한번 이것은 사용자가 항상 경로가 아닌 스크립트에 절대 경로를 사용하도록 "$(pwd)/someprog"
합니다.
/
경로 검색 규칙은 대한 문제에 대한 해결책을 기억하는 간단한을 제공합니다 :
- 슬래시 : 사용하지 마십시오
PATH
- 슬래시 없음 : 사용 만
PATH
현재 디렉토리의 파일이 ./somefile
또는 로 표현 될 수 있다는 사실에 의존하여 실행중인 내용을 항상 쉽게 알 수 somefile
있으므로 그 중 하나에 특별한 의미를 부여합니다.
때때로, 당신이 검색 할 수있는 약간 짜증나는 some/prog
상대에 대한 PATH
,하지만이에 온건 솔루션을 볼 수 없습니다.