echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:.
위의 두 경로 변수의 차이점은 무엇입니까?
이것이 명령처럼 실행 파일을 실행한다는 것을 알았지만 확실하지 않습니다.
답변1
경로에 추가한다는 것은 .
쉘이 현재 디렉토리의 실행 파일을 고려하여 더 이상 실행 파일을 사용할 수 없음을 의미합니다../
접두어로 입력이 필요합니다 .. 귀하의 경우에는 마지막 항목이므로 다른 일치 항목이 없는 경우에만 해당 명령이 실행 ls
됩니다 /bin/ls
.
여기에는 일반적으로 여러 가지 이유가 있습니다.아니요권장사항(위 링크 참조):
.
이는 보안에 해로울 수 있습니다. 누군가가 자주 액세스하는 디렉토리에 바이너리를 남겨두고 실수로 실행하기를 바라기 때문입니다. 비록 첫 번째 항목이 아닌 마지막 항목이 되는 것이 덜 위험할지라도;- 현재 디렉터리 없이 명령을 실행한다는 것은
./
경로에서 첫 번째로 일치하는 명령이 사용됨을 의미하며, 반드시 현재 디렉터리에 있는 명령일 필요는 없습니다.
답변2
배경 정보: PATH 환경 변수는 콜론으로 구분된 디렉터리 목록입니다. 명시적인 경로를 지정하지 않고 명령 이름을 입력하면(예: "/bin/ls" 대신 "ls" 입력) 쉘은 해당 이름의 순서대로 PATH 목록의 각 디렉터리와 쉘을 검색합니다. 찾은 첫 번째 일치 프로그램을 실행합니다.
PATH 목록의 디렉터리 중 하나는 현재 디렉터리 "."일 수 있습니다. . PATH 목록에서 빈 디렉터리 이름을 사용하여 현재 디렉터리를 나타낼 수도 있습니다. 이 둘은 동등하다
csh 사용자의 경우:
setenv PATH :/usr/ucb:/bin:/usr/bin
setenv PATH .:/usr/ucb:/bin:/usr/bin
sh 또는 ksh 사용자의 경우
PATH=:/usr/ucb:/bin:/usr/bin export PATH
PATH=.:/usr/ucb:/bin:/usr/bin export PATH
PATH 어딘가에 "."가 있으면 편리합니다. "./a.out" 대신 "a.out"을 입력하면 현재 디렉터리에서 프로그램을 실행할 수 있습니다. 하지만 문제가 있습니다.
"."의 경우 무슨 일이 일어나는지 생각해 보세요. PATH의 첫 번째 항목입니다. 현재 디렉토리가 "/tmp"와 같이 공개적으로 쓰기 가능한 디렉토리라고 가정합니다. 다른 사용자가 남긴 "/tmp/ls"라는 프로그램이 있고 "ls"를 입력하면(물론 일반적인 "/bin/ls" 프로그램을 실행하려고 함) 쉘이 대신 " 을 실행합니다. /ls", 다른 사용자의 프로그램. 말할 필요도 없이, 이렇게 알려지지 않은 프로그램을 실행한 결과는 여러분을 놀라게 할 수도 있습니다.
"."을 갖는 것이 약간 더 좋습니다. 경로 끝에서:
setenv PATH /usr/ucb:/bin:/usr/bin:.
이제 /tmp에 "ls"를 입력하면 쉘은 /usr/ucb, /bin 및 /usr/bin에서 "ls"라는 프로그램을 검색한 다음 "."를 찾고 실수로 사용자의 다른 프로그램을 실행합니다. "ls" 프로그램은 덜 위험합니다. 하지만 100% 안전하지는 않습니다. 만약 당신이 서투른 타이피스트이고 어느 날 "ls -l" 대신 "sl -l"을 입력한다면 "./sl"(어떤 대화라도)을 실행할 위험이 있습니다. 일부 "영리한" 프로그래머는 일반적인 오타를 예상하고 이러한 이름을 가진 프로그램을 공용 디렉토리에 흩뿌릴 수 있습니다. 경계하십시오.
숙련된 많은 Unix 사용자는 "." 없이도 잘 지냅니다. 경로에서:
setenv PATH /usr/ucb:/bin:/usr/bin
이렇게 하면 현재 디렉터리에서 프로그램을 실행하려면 "program" 대신 "./program"을 입력해야 하지만 추가된 보안은 그만한 가치가 있습니다.