실행 파일 또는 스크립트 이름 앞에 ./ (닷슬래시)가 필요한 이유는 무엇입니까?
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/prog
PATH
하지만 이에 대한 보다 건전한 해결책은 보이지 않습니다.
스크립트가 경로에 없는 경우 스크립트가 필요합니다.상세한 것에 대하여는, 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 |