"."을 추가하면 무슨 소용이 있나요? (점)이 경로 변수에 있습니까?

"."을 추가하면 무슨 소용이 있나요? (점)이 경로 변수에 있습니까?
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"을 입력해야 하지만 추가된 보안은 그만한 가치가 있습니다.

관련 정보