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


288

bash에서 스크립트를 실행할 때 ./처음 에 작성해야합니다 .

$ ./manage.py syncdb

그렇지 않으면 오류 메시지가 나타납니다.

$ manage.py syncdb
-bash: manage.py: command not found

그 이유는 무엇입니까? .현재 폴더의 별칭 이라고 생각 했으므로이 두 호출은 동일해야합니다.

또한 다음 ./과 같은 응용 프로그램을 실행할 때 왜 필요하지 않은지 이해하지 못합니다 .

user:/home/user$ cd /usr/bin
user:/usr/bin$ git

(없이 실행 ./)


4
이것은 내가 지금까지 겪었던
odigity

답변:


307

유닉스에서는 일반적으로 현재 디렉토리가에 없습니다 $PATH.

명령을 입력하면 쉘은 PATH변수 로 지정된 디렉토리 목록을 찾습니다 . 현재 디렉토리가 해당 목록에 없습니다.

해당 목록에 현재 디렉토리가없는 이유는 보안입니다.

루트이고 다른 사용자의 디렉토리로 이동하여 sl대신에 유형을 입력한다고 가정 해 봅시다 ls. 현재 디렉토리가에 있으면 PATH쉘은 sl다른 디렉토리가 없기 때문에 해당 디렉토리 에서 프로그램 을 실행하려고 시도합니다 sl. 이 sl프로그램은 악성 일 수 있습니다.

그것은 작동 ./하기 때문에 POSIX가 지정 포함 명령 이름이 있음 /에서 검색을 억제, 직접 파일 이름으로 사용됩니다 $PATH. 동일한 효과를 위해 전체 경로를 사용할 수는 있지만 ./더 짧고 작성하기 쉽습니다.

편집하다

sl부분은 단지 예일뿐입니다. 디렉토리 PATH는 순차적으로 검색되고 일치하는 경우 해당 프로그램이 실행됩니다. 따라서 모양에 따라 PATH일반 명령을 입력하면 현재 디렉토리에서 프로그램을 실행하기에 충분하지 않을 수 있습니다.


47
아무것도 잘못 입력하지 않아도됩니다. 사용자는 ls실행 파일 이 포함 된 악성 패키지를 다운로드했을 수 있습니다 .
Juliano

13
이것은 단지 유닉스가 아닌 윈도우에 말을 모든 사람에게 그냥 메모, 이것은 PowerShell에서 동일합니다 - 당신이해야 할 .\my.bat실행 등
manojlds

1
@gaearon ergh, 나는 그것이 "별명이다"라고 말했을 때 "별명은 아니다"라고 말했다.
Charles Duffy

4
그것은 매우 유용한 설명이었습니다. 20 년 전 DOS로 조금 작업했을 때 CMD가 현재 디렉토리를 확인한 다음 경로를 확인했다고 생각하므로 Linux의 동작은 내가 예상 한 것이 아니지만 많은 의미가 있습니다.
TecBrat

2
@cnicutar는 : 흥미롭게도 오늘은이 있음을 발견 sl;-) 기본적으로 사용할 수있는 명령이라고 증기 기관차 아니지만
대장장이

51

bash는 명령 행을 해석 할 때 환경 변수에 설명 된 위치에서 명령을 찾습니다 $PATH. 그것을 보려면 다음을 입력하십시오.

echo $PATH

콜론으로 구분 된 경로가 있습니다. 보시다시피 현재 경로 .는 일반적으로 없습니다 $PATH. 따라서 Bash는 현재 디렉토리에 있으면 명령을 찾을 수 없습니다. 다음을 수행하여 변경할 수 있습니다.

PATH=$PATH:.

이 행은 현재 디렉토리를 추가하여 $PATH다음을 수행 할 수 있습니다.

manage.py syncdb

그것은되는 하지 로,이 보안 문제를 가지고 권장, 플러스 당신은 이상한 행동을 할 수 있습니다 .당신이있는 디렉토리에 따라 다름 :

기피:

PATH=.:$PATH

표준 명령을“마스크”하고 보안 위반의 문을 열 수 있습니다. :)

내 두 센트.


42

쉘이 $PATH환경 변수를보고 스크립트를 찾을 때 홈 디렉토리에있을 때 스크립트를 찾을 수 없습니다.

./'에 지정된 모든 디렉토리에서 내 스크립트의 현재 디렉토리에보기보다는보고를 말한다 $PATH'.


5

'.'를 포함하면 본질적으로 실행 가능한 bash 스크립트에 "전체 경로"를 제공하므로 쉘은 PATH 변수를 확인할 필요가 없습니다. '.'없이 쉘은 PATH 변수를 찾습니다 ( echo $PATH입력 한 명령이 PATH의 폴더에 있는지 확인하기 위해 실행 하여 볼 수 있습니다 . manage.py의 경우와 같이). PATH에 현재 디렉토리를 포함시키는 것은 좋지 않은 것으로 간주됩니다. http://www.faqs.org/faqs/unix-faq/faq/part2/section- 13.html


2

* nix에서 Windows와 달리 현재 디렉토리는 일반적으로 $PATH변수에 없습니다 . 따라서 명령을 실행할 때 현재 디렉토리가 검색되지 않습니다. ./이러한 응용 프로그램 $ PATH에 있으므로 응용 프로그램을 실행할 필요가 없습니다 . /bin또는에 있을 가능성이 높습니다 /usr/bin.


1

이 질문에는 이미 멋진 답변이 있지만 실행 파일이 PATH에 있고 실행할 때 매우 다른 출력을 얻는다면 추가하고 싶습니다.

./executable

당신이 실행하면 얻을 사람에게

executable

(하나가 아닌 다른 오류 메시지가 표시되는 경우) 문제는 컴퓨터에 두 가지 버전의 실행 파일이 있다는 것입니다. 하나는 경로에 있고 다른 하나는 그렇지 않습니다.

실행하여 이것을 확인하십시오

어느 실행 파일

whereis executable

문제가 해결되었습니다 ... 실행 파일의 세 가지 버전이 있는데 그 중 하나만 환경에 맞게 올바르게 컴파일되었습니다.


0

의 근거 /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 기준

그런 다음 방금 someproggit 저장소에서 스크립트 를 다운로드하고 CWD에서 스크립트 를 실행하려는 경우 배포판에 다음이 있기 때문에 이것이 실제로 실행될 프로그램인지 확신 할 수 없습니다.

/bin/someprog

작년 크리스마스 이후에 술을 너무 많이 마신 후 설치 한 일부 패키지의 경로입니다.

따라서 다시 한 번, CWD를 기준으로 항상 로컬 스크립트를 실행하여 전체 경로를 사용하여 실행중인 것을 알 수 있습니다.

"$(pwd)/someprog"

그것은 또한 매우 성가시다.

당신이 생각해보고 싶은 또 다른 규칙은 다음과 같습니다.

상대 경로는 PATH 만 사용하고 절대 경로는 CWD 만 사용합니다.

그러나 다시 한번 이것은 사용자가 항상 경로가 아닌 스크립트에 절대 경로를 사용하도록 "$(pwd)/someprog"합니다.

/경로 검색 규칙은 대한 문제에 대한 해결책을 기억하는 간단한을 제공합니다 :

  • 슬래시 : 사용하지 마십시오 PATH
  • 슬래시 없음 : 사용 만 PATH

현재 디렉토리의 파일이 ./somefile또는 로 표현 될 수 있다는 사실에 의존하여 실행중인 내용을 항상 쉽게 알 수 somefile있으므로 그 중 하나에 특별한 의미를 부여합니다.

때때로, 당신이 검색 할 수있는 약간 짜증나는 some/prog상대에 대한 PATH,하지만이에 온건 솔루션을 볼 수 없습니다.


-1

스크립트가 경로에 없으면 그렇게해야합니다. 자세한 내용은 http://www.tldp.org/LDP/Bash-Beginners-Guide/html/sect_02_01.html을 참조하십시오.


5
참고로, irc.freenode.org의 #bash에서 우리는 사람들이 TLDP (특히 Advanced Bash Guide)에서 배운 오해를 지속적으로 수정하고 있습니다. 따라서 사람들에게 지시하는 것은 이상적이지 않을 수 있습니다. (우리가 선호하는 입문서는 mywiki.wooledge.org/BashGuide )
Charles Duffy

-2

모두 질문에 대한 훌륭한 대답을 가지고 있으며, 절대 경로를 포함하지 않는 한 현재 디렉토리에서 실행할 때만 적용됩니다. 아래 샘플을 참조하십시오.

또한 하위 폴더 tmp2 (/ tmp / tmp2)에서 명령을 사용하고 (더블 도트 슬래시)를 사용하면 (점 슬래시)가 의미가 있습니다.

견본:

[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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.