실행 파일 또는 스크립트 이름 앞에 ./ (닷슬래시)가 필요한 이유는 무엇입니까?
bash에서 스크립트를 실행할 때 작성해야 합니다../처음에:
$ ./manage.py syncdb
그렇지 않으면 다음 오류 메시지가 나타납니다.
$ manage.py syncdb
-bash: manage.py: command not found
그 이유는 무엇입니까?내 생각에는 말이지….는 현재 폴더의 에일리어스이므로 이들2개의 콜은 동등합니다.
나도 왜 내가 필요없는지 모르겠어./다음과 같은 응용 프로그램을 실행하는 경우:
user:/home/user$ cd /usr/bin
user:/usr/bin$ git
(이러한 동작은 필요 없습니다)../)
Unix 에서는, 통상은, 현재의 디렉토리가 다음의 장소에 없기 때문입니다.$PATH.
명령어를 입력하면 셸은 에서 지정한 디렉토리 목록을 검색합니다.PATH변수.현재 디렉토리가 이 목록에 없습니다.
이 목록에 현재 디렉토리가 없는 이유는 보안 때문입니다.
사용자가 루트라고 가정하고 다른 사용자의 디렉토리에 접속하여sl대신ls현재 디렉토리가 에 있는 경우PATH, 셸은 이 명령어를 실행하려고 합니다.sl(다른 것은 없기 때문에) 그 디렉토리에 있는 프로그램sl프로그램)을 클릭합니다.그거sl악성 프로그램일 수 있습니다.
와 함께 동작합니다../왜냐하면 POSIX는 명령어 이름에 command name이 포함되어 있기 때문입니다./파일명으로 직접 사용되며 검색을 억제합니다.$PATH같은 효과를 얻기 위해 전체 경로를 사용할 수도 있었지만./더 짧고 쓰기 쉽습니다.
편집
그거sl부품은 예에 불과합니다.의 디렉토리PATH순차적으로 검색되며 일치하면 해당 프로그램이 실행됩니다.그래서 어떻게 하느냐에 따라서PATH일반적인 명령어를 입력하면 현재 디렉토리에서 프로그램을 실행하기에 충분할 수도 있고 그렇지 않을 수도 있습니다.
bash가 명령줄을 해석할 때 환경 변수에 설명된 위치에서 명령을 찾습니다.$PATH. 를 표시하려면 , 다음과 같이 입력합니다.
echo $PATH
콜론으로 구분된 경로가 있습니다.현재 경로를 볼 수 있듯이.보통 에 없습니다.$PATH따라서 Bash가 현재 디렉토리에 있는 경우 명령을 찾을 수 없습니다.다음을 통해 변경할 수 있습니다.
PATH=$PATH:.
이 행은 현재 디렉토리를 에 추가합니다.$PATH다음 작업을 수행할 수 있습니다.
manage.py syncdb
보안 문제가 있고 이상한 행동을 할 수 있으므로 권장하지 않습니다..는, 사용하고 있는 디렉토리에 의해서 다릅니다. : ).
회피:
PATH=.:$PATH
몇 가지 표준 명령어를 "마스크"하여 보안 침해의 문을 열 수 있습니다.
내 의견일 뿐이야.
이 을 할 때  수 .$PATH환경변수를 지정하여 스크립트를 찾습니다.
./ 、 「  」 、 「 Look in current directory for my script 」로 되어 있는  표시되지 .$PATH
 path변수를 .를 포함하면 기본적으로 실행 가능한 bash 스크립트에 "full path"를 제공하므로 셸에서 PATH 변수를 확인할 필요가 없습니다.변수('.'를 하면 알 수 .)를 검색합니다.echo $PATH입력한 명령이 PATH의 폴더에 있는지 확인합니다.그렇지 않은 경우(관리와 마찬가지로).py) 파일을 찾을 수 없다고 합니다.현재 디렉토리를 PATH에 포함시키는 것은 잘못된 관행으로 간주됩니다.이것에 대해서는, http://www.faqs.org/faqs/unix-faq/faq/part2/section-13.html 를 참조해 주세요.
 디렉토리는  *nix Windows에 .$PATH 명령어를 때 되지 않습니다.따라서 명령어를 실행할 때 현재 디렉토리는 검색되지 않습니다. 없다./$PATH에 있기 때문에 실행 중인 어플리케이션에 적합합니다.대부분의 경우 어플리케이션은 $PATH에 있습니다./bin ★★★★★★★★★★★★★★★★★」/usr/bin.
이 질문에는 이미 몇 가지 훌륭한 답변이 있습니다.단, 실행 파일이 PATH 상에 있고 실행 시 매우 다른 출력을 얻을 수 있다면 추가하겠습니다.
./executable
도망가면 얻을 수 있는 것들로
executable
(1개의 에러 메시지와 다른 쪽 에러 메세지가 표시되었다고 가정하면), 머신에 2개의 다른 버전의 실행 파일이 있는 것이 문제일 가능성이 있습니다.하나는 패스상에 있고 다른 하나는 패스상에 있지 않습니다.
실행으로 확인
실행 가능한 파일
그리고.
whereis executable
그게 내 문제를 해결했어세 가지 버전의 실행 파일이 있었는데, 그 중 하나만 환경에 맞게 컴파일되었습니다.
「 」의 / PATH 규칙 POSIX PATH " "
이 규칙은 다음 위치에서 언급되었습니다.bash에서 실행하기 위해 실행 파일 또는 스크립트 이름 앞에 ./ (닷슬래시)가 필요한 이유는 무엇입니까? 하지만 저는 왜 그것이 좋은 디자인이라고 생각하는지 좀 더 자세히 설명하고 싶습니다.
먼저 규칙의 명시적인 풀버전은 다음과 같습니다.
- 에 「」가 포함되어 있는 ././someprog,/bin/someprog,./bin/someprog되지 않음: CWD "PATH" "PATH" "PATH" "PATH" "PATH" "PATH" "PATH" "PATH" "PATH"
- 에 「」가  않은 ./someprog되지 않음: PATH "CWD"
이제 실행 중인 경우를 가정해 보겠습니다.
someprog
검색:
- 우선 CWD에 대해서
- 이후의 PATH에 대해서
그럼, 만약 네가 도망치고 싶다면/bin/someprog 작업을수행했습니다.
someprog
 다른 관련이 없는 다른 가 들어  수 어떤  실패할 수도 있습니다.다른 디렉토리에는 관련이 없는 다른 디렉토리가 포함되어 있을 수 있기 때문입니다.someprog프로그램.
따라서 PATH를 사용할 때는 항상 절대 경로를 사용하게 되므로 PATH의 목적을 무시하게 됩니다.
PATH에 상대 패스를 두는 것이 매우 좋지 않은 이유이기도 합니다.난 널 보고 있어.
반대로 다음과 같이 실행한다고 가정합니다.
./someprog
검색 대상:
- 상대적인 PATH first
- 이후 CWD에 대한 상대적인
 스크립트를 someprog 실행할 수 . cWD가  수 입니다.왜냐하면 당신의 디스트로에는 다음과 같은 기능이 있을 수 있기 때문입니다.
/bin/someprog
작년 크리스마스 이후 과음한 후 설치한 패키지에서 나온 PATH입니다.
따라서 다시 한 번 풀패스를 사용하여 CWD에 관련된 로컬스크립트를 항상 실행하여 실행 중인 것을 확인할 필요가 있습니다.
"$(pwd)/someprog"
그것도 굉장히 짜증날 것 같아요.
여러분이 생각해 내고 싶은 또 다른 규칙은 다음과 같습니다.
상대경로는 PATH만 사용하고 절대경로는 CWD만 사용합니다.
, 이  이외의 에 대해 PATH 스크립트의 절대 를 항상 됩니다."$(pwd)/someprog".
/경로 검색 규칙은 에 관한 문제에 대한 기억하기 쉬운 솔루션을 제공합니다.
-  "t use: " " " " "PATH
- slash : " "만 사용 : "만 사용PATH
, 현재  내의 은 「실행하고 있는 파일」이라고 수  항상 하고 있는지를 알 수../somefile ★★★★★★★★★★★★★★★★★」somefile그래서 그들 중 한 명에게 특별한 의미를 부여합니다.
 sometimes sometimes for for for for for for for for for for for for for for for 를 검색할 수 없는 것이 약간  수 some/progPATH하지만 이에 대한 보다 건전한 해결책은 보이지 않습니다.
스크립트가 경로에 없는 경우 스크립트가 필요합니다.상세한 것에 대하여는, http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html 를 참조해 주세요.
이 질문에 대한 모든 답변은 훌륭합니다.네, 이것은 절대 경로를 포함하지 않는 한 현재 디렉토리에서 실행할 때만 해당됩니다.아래 샘플 참조.
또한 하위 폴더 tmp2(/tmp/tmp2)에서 명령어를 사용했을 때 (double dot-slash)가 사용되었을 때 (double dot-slash)
샘플:
[fifiip-172-31-17-12 tmp]$ ./StackO.sh
Hello Stack Overflow
[fifi@ip-172-31-17-12 tmp]$ /tmp/StackO.sh
Hello Stack Overflow
[fifi@ip-172-31-17-12 tmp]$ mkdir tmp2
[fifi@ip-172-31-17-12 tmp]$ cd tmp2/
[fifi@ip-172-31-17-12 tmp2]$ ../StackO.sh
Hello Stack Overflow
언급URL : https://stackoverflow.com/questions/6331075/why-do-you-need-dot-slash-before-executable-or-script-name-to-run-it-in-bas
'sourcecode' 카테고리의 다른 글
| 리모트 Git 브랜치를 작성하려면 어떻게 해야 하나요? (0) | 2023.04.18 | 
|---|---|
| SQL Server 연결 문자열에서 포트 번호를 지정하는 방법 (0) | 2023.04.18 | 
| Bash에서 두 변수 빼기 (0) | 2023.04.18 | 
| 다른 git 저장소에서 cherry-pick이 가능합니까? (0) | 2023.04.18 | 
| 동일한 select 문장에서 count 및 group by를 사용하는 방법 (0) | 2023.04.18 |