Linux/UNIX에서 파일을 실행하기 위해 "./"(점-슬래시)를 사용하는 이유는 무엇입니까?

Linux/UNIX에서 파일을 실행하기 위해 "./"(점-슬래시)를 사용하는 이유는 무엇입니까?

파일을 실행하기 위해 리눅스를 사용하는 이유는 무엇입니까 ./filename?

그냥 다른 명령처럼 입력하면 어떨까요 gcc?ls

답변1

리터럴 답변은 다른 사람들이 제공한 것과 같습니다. 현재 디렉토리가 $PATH.

하지만왜?한마디로 안전에 관한 것입니다. 다른 사람의 홈 디렉토리(또는 /tmp)를 보고 gcc또는 을 입력하면 ls장난꾸러기 친구가 작성한 악의적인 버전이 아니라 실제 버전을 실행하고 있어 모든 파일을 삭제할 수 있다는 것을 알고 싶을 것입니다. 또 다른 예는 test또는 입니다 [. 쉘에 이러한 명령이 내장되어 있지 않으면 쉘 스크립트에서 이러한 명령을 대체할 수 있습니다.

.~로 가지고 있다마지막자신의 경로로 진입하는 것이 더 안전하지만 이를 이용하는 다른 공격도 있습니다. 이를 수행하는 쉬운 방법은 sl또는 와 같은 일반적인 철자 오류를 활용하는 것입니다 ls-l. 또는 해당 시스템에 설치되지 않는 일반적인 명령을 찾으십시오. vim예를 들어 시스템 관리자가 평균보다 더 자주 명령을 입력하기 때문입니다.

너무 이론적으로 들리나요? 그것최대예, 하지만 실제로는 특히 다중 사용자 시스템에서 이런 일이 확실히 발생합니다. 실제로,다음은 이 웹사이트의 예입니다.관리자는 사용자의 홈 디렉터리로 전환하여 ps해당 이름의 실행 파일이 차단된 것을 발견합니다.

답변2

Linux, UNIX 및 관련 운영 체제에서는 .현재 디렉터리를 나타냅니다. 당신의 디렉토리가 아닌 현재 디렉토리에서 파일을 실행하고 싶기 때문에 실행 파일이 어디에 있는지 쉘에 알려주려면 $PATH약간의 비트가 필요합니다 . ./따라서 ./foo이 디렉터리에 이름이 지정된 실행 파일을 실행하는 것을 의미합니다.foo

당신은 그것을 사용할 수 있습니다type또는which.$PATH

답변3

그렇다면 처음에 ./가 필요한 이유는 (Windows와 달리) 현재 디렉터리가 기본적으로 경로의 일부가 아니기 때문입니다. 실행하는 경우:

$ ls

ls쉘은 PATH 환경 변수의 디렉토리를 살펴보고( echo $PATH확인하기 위해) 찾은 첫 번째 실행 파일을 실행합니다 ls. 다음을 입력하는 경우:

$ a.out

쉘은 동일한 작업을 수행하지만 a.out이라는 실행 파일을 찾지 못할 수도 있습니다. a.out이 어디에 있는지 쉘에 알려주어야 합니다. 현재 디렉토리(.)에 있으면 경로는 입니다 ./a.out.

왜 "a.out"이라고 불리는지 묻는다면 그것은 단지 gcc의 기본 출력 파일 이름일 뿐입니다. -o 명령줄 매개변수를 사용하여 변경할 수 있습니다. 예를 들어:

$ gcc test.c -o test
$ ./test

답변4

실제로 더 완전한 규칙은 다음과 같습니다. /경로에 슬래시가 있으면 검색하지 마세요.PATH

작동 방식을 알아보기 전에 먼저 다음 사실을 이해해야 합니다. 다음 중 하나를 실행하세요.

bin/someprog

또는:

/bin/someprog

또는:

cd bin
./myexec

을 실행할 때 변수를 bin/someprog검색할 필요가 없습니다 . 정확히 같은 이유로 all 이며 그 안에 슬래시가 있습니다.PATHbin/someprog/bin/someprog./someprog/

someprogalone에는 슬래시가 없으므로 /에서만 검색합니다 PATH.

POSIX 7다음에 대해 이 규칙을 지정합니다.http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_09_01_01

[...] 찾고 있는 경로 이름에 가 포함되어 있으면 <slash>경로 접두사로 검색하면 안 됩니다 .

/POSIX PATH 규칙의 기본 사항

실행 중이라고 가정합니다.

someprog

다음을 검색합니다:

  • CWD와 관련된 첫 번째
  • 이후 PATH 기준

/bin/someprog그런 다음 배포판에서 실행 하려면 다음을 수행하십시오.

someprog

때로는 작동하지만 someprog관련되지 않은 다른 프로그램이 포함된 디렉터리에 있을 수 있기 때문에 실패하는 경우도 있습니다.

따라서 이것이 신뢰할 수 없다는 것을 빨리 알게 될 것이며 PATH를 사용하려는 경우 항상 절대 경로를 사용하게 되어 PATH의 목적이 무산됩니다.

이것이 PATH에 상대 경로를 포함하는 것이 매우 나쁜 생각인 이유입니다. 그래요너를보고있는,node_modules/bin.

대신 다음을 실행한다고 가정해 보겠습니다.

./someprog

다음을 검색합니다:

  • PATH에 상대적인 첫 번째
  • 이후 CWD 기준

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

/bin/someprog

이것은 지난 크리스마스에 술을 너무 많이 마신 후에 설치한 일부 패키지의 PATH입니다.

따라서 실행 중인 항목을 확인하려면 전체 경로를 사용하여 CWD를 기준으로 항상 로컬 스크립트를 실행해야 합니다.

"$(pwd)/someprog"

이것은 또한 매우 성가신 일이 될 수 있습니다.

생각해 낼 수 있는 또 다른 규칙은 다음과 같습니다.

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

그러나 이로 인해 사용자는 PATH가 아닌 스크립트에 대해 항상 절대 경로를 사용해야 합니다 "$(pwd)/someprog".

경로 /검색 규칙은 정보 문제에 대한 간단하고 기억하기 쉬운 솔루션을 제공합니다.

  • 슬래시: 사용되지 않음PATH
  • 슬래시 없음: 그냥 사용하세요PATH

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

some/prog때로는 무언가에 대한 검색이 불가능해서 조금 짜증나는 경우가 있지만 PATH, 더 똑똑한 해결책은 보이지 않습니다.

관련 정보