%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EB%8A%94%20%EC%9D%B4%EC%9C%A0%EB%8A%94%20%EB%AC%B4%EC%97%87%EC%9E%85%EB%8B%88%EA%B9%8C%3F.png)
파일을 실행하기 위해 리눅스를 사용하는 이유는 무엇입니까 ./filename
?
그냥 다른 명령처럼 입력하면 어떨까요 gcc
?ls
답변1
리터럴 답변은 다른 사람들이 제공한 것과 같습니다. 현재 디렉토리가 $PATH
.
하지만왜?한마디로 안전에 관한 것입니다. 다른 사람의 홈 디렉토리(또는 /tmp)를 보고 gcc
또는 을 입력하면 ls
장난꾸러기 친구가 작성한 악의적인 버전이 아니라 실제 버전을 실행하고 있어 모든 파일을 삭제할 수 있다는 것을 알고 싶을 것입니다. 또 다른 예는 test
또는 입니다 [
. 쉘에 이러한 명령이 내장되어 있지 않으면 쉘 스크립트에서 이러한 명령을 대체할 수 있습니다.
.
~로 가지고 있다마지막자신의 경로로 진입하는 것이 더 안전하지만 이를 이용하는 다른 공격도 있습니다. 이를 수행하는 쉬운 방법은 sl
또는 와 같은 일반적인 철자 오류를 활용하는 것입니다 ls-l
. 또는 해당 시스템에 설치되지 않는 일반적인 명령을 찾으십시오. vim
예를 들어 시스템 관리자가 평균보다 더 자주 명령을 입력하기 때문입니다.
너무 이론적으로 들리나요? 그것최대예, 하지만 실제로는 특히 다중 사용자 시스템에서 이런 일이 확실히 발생합니다. 실제로,다음은 이 웹사이트의 예입니다.관리자는 사용자의 홈 디렉터리로 전환하여 ps
해당 이름의 실행 파일이 차단된 것을 발견합니다.
답변2
답변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 이며 그 안에 슬래시가 있습니다.PATH
bin/someprog
/bin/someprog
./someprog
/
someprog
alone에는 슬래시가 없으므로 /
에서만 검색합니다 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 기준
그런 다음 방금 someprog
git 저장소에서 스크립트를 다운로드하고 CWD에서 실행하려는 경우 배포판에 다음이 있을 수 있으므로 이것이 실행될 실제 프로그램인지 확신할 수 없습니다.
/bin/someprog
이것은 지난 크리스마스에 술을 너무 많이 마신 후에 설치한 일부 패키지의 PATH입니다.
따라서 실행 중인 항목을 확인하려면 전체 경로를 사용하여 CWD를 기준으로 항상 로컬 스크립트를 실행해야 합니다.
"$(pwd)/someprog"
이것은 또한 매우 성가신 일이 될 수 있습니다.
생각해 낼 수 있는 또 다른 규칙은 다음과 같습니다.
상대 경로는 PATH만 사용하고, 절대 경로는 CWD만 사용합니다.
그러나 이로 인해 사용자는 PATH가 아닌 스크립트에 대해 항상 절대 경로를 사용해야 합니다 "$(pwd)/someprog"
.
경로 /
검색 규칙은 정보 문제에 대한 간단하고 기억하기 쉬운 솔루션을 제공합니다.
- 슬래시: 사용되지 않음
PATH
- 슬래시 없음: 그냥 사용하세요
PATH
이를 통해 현재 디렉토리의 파일을 통해 ./somefile
실행 중인 항목이 또는 로 표시될 수 있다는 것을 항상 쉽게 알 수 있으므로 somefile
그 중 하나에 특별한 의미를 부여합니다.
some/prog
때로는 무언가에 대한 검색이 불가능해서 조금 짜증나는 경우가 있지만 PATH
, 더 똑똑한 해결책은 보이지 않습니다.