foo라는 프로그램이 있는데 단순히 foo가 아니라 ./foo라고 말해야 하는 이유는 무엇입니까? ./는 현재 디렉터리 내를 의미하지 않나요?
답변1
명령만 입력하는 경우 – 예: foo
– 쉘(보통 bash
)은 /bin, /usr/bin, /usr/X11R6/bin 등과 같은 특정 디렉토리에서만 이를 찾습니다. 일반적으로~ 아니다보안 문제 때문에 "현재 디렉터리"(예: ".")를 살펴보세요(특히만약 당신이뿌리). 만약에 "." 추가되었습니다. 추가해야 합니다.끝검색 경로.
실행 파일을 실행하고 싶다면~ 아니다이 검색 경로에서는 명령에 대한 전체 절대 또는 상대 경로를 지정해야 합니다. 예를 들어:
/home/bok/foo # Absolute in my homedir
~/src/bar # Shorthand for my homedir and a subdir in it
../Download/foobar # Relative path – up one step, then down in Download
또는 – 명령이 현재 디렉터리에 있는 경우 – 간단히 다음을 추가하세요 ./
.
./foo
검색 경로는 bash
다음 위치에 저장됩니다.길환경 변수이므로 다음을 입력하여 볼 수 있습니다.
echo $PATH
"."를 추가하려면 – 당신은 정말로해서는 안 된다해야 할 일 – 다음을 입력하세요.
export PATH="$PATH:."
PATH는 순서대로 검색되므로 서로 다른 디렉터리에 동일한 이름을 가진 실행 파일이 여러 개 있는 경우 셸이 실행할 PATH의 첫 번째 디렉터리에 있는 실행 파일입니다.
먼저 나열된 모든 디렉토리를 살펴본 후 "명령을 찾을 수 없음" 오류가 발생합니다.
+++
현재 디렉토리를 PATH에 추가할 때의 문제점은 .
우연히 있을 수 있는 "비표준" 디렉토리의 실행 파일이 실행되어야 하는지 여부를 실제로 알 수 없다는 것입니다.
내가 악하다고 가정해 보자. 가능한 한 많은 파일을 삭제하고 이를 내 홈 디렉토리(또는 더 나쁘게는 /tmp)에 남겨두는 파괴적인 프로그램을 만든다. 나는 이 프로그램 sl
(일반적인 실수 유형 ls
)을 호출하고 기다린다.
일부 임의의 사용자가 /tmp에 ls
있는데 sl
. 일반 PATH 사용 – . – "명령을 찾을 수 없음"이라는 오류가 발생하는 것을 제외하고는 아무 일도 일어나지 않습니다. 그가 '.'을 얻었다면 PATH 끝에 있으면 명령을 입력해도 오류가 발생하지 않습니다. 대신 내 sl
명령이 실행되고 그가 소유한 모든 파일이 삭제됩니다. 혹시 그 사람이 그렇다면뿌리, 이 명령은 시스템의 대부분을 삭제할 수 있습니다. (이는 이유뿌리 정말로 그래야 한다그것을 규칙으로 삼아라언제나사용전체 경로PATH를 신뢰하는 대신 명령을 사용합니다.)
그가 '.'을 배치했다면 그의 PATH에서 먼저 (정확한 철자)라는 프로그램을 만들어 ls
디렉토리에 넣었습니다.나의일반적인 프로그램은 아니지만 해당 디렉토리에 ls
입력하면 실행되는 프로그램입니다. ls
왜냐하면 bash
현재 디렉토리(.)를 검색하기 때문입니다.첫 번째– 정품이 포함된 시스템 디렉터리를 살펴보기 전에 ls
.