sourcecode

실행 파일 또는 스크립트 이름 앞에 ./ (닷슬래시)가 필요한 이유는 무엇입니까?

codebag 2023. 4. 18. 22:37
반응형

실행 파일 또는 스크립트 이름 앞에 ./ (닷슬래시)가 필요한 이유는 무엇입니까?

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

반응형