it-swarm-ko.tech

왜 Linux / UNIX에서 "./"(점 슬래시)를 사용하여 파일을 실행합니까?

왜 우리는 ./filename 리눅스에서 파일을 실행 하시겠습니까?

다른 명령 gcc, ls etc ...처럼 입력하지 않겠습니까?.

89
Renjith G

Linux, UNIX 및 관련 운영 체제에서 .는 현재 디렉토리를 나타냅니다. 현재 디렉토리에서 파일을 실행하려고하고 해당 디렉토리가 $PATH에 있지 않으므로 쉘에 실행 파일이있는 위치를 알려주려면 ./ 비트가 필요합니다. 따라서 ./foo는이 디렉토리에있는 foo라는 실행 파일을 실행하는 것을 의미합니다.

type 또는 which 을 사용하여 $PATH에있는 모든 명령의 전체 경로를 가져올 수 있습니다.

80
badp

현재 디렉토리가 $PATH에 없기 때문에 문자 그대로의 대답은 다른 사람들이 제공 한 것과 같습니다.

그러나 why? 간단히 말하면 보안을위한 것입니다. 다른 사람의 홈 디렉토리 (또는/tmp)를보고 gcc 또는 ls 만 입력하면 악의적 인 버전이 아니라 실제 버전을 실행하고 있다는 것을 알고 싶을 것입니다. 장난 꾸러기 친구가 작성하여 모든 파일을 지 웁니다. 또 다른 예는 test 또는 [이며, 쉘에 내장 명령이없는 경우 쉘 스크립트에서 해당 명령을 무시할 수 있습니다.

경로에서 last 항목으로 .를 사용하는 것이 좀 더 안전하지만이를 사용하는 다른 공격이 있습니다. 쉬운 방법은 sl 또는 ls-l와 같은 일반적인 오타를 사용하는 것입니다. 또는이 시스템에 설치되지 않은 일반적인 명령 (vim)을 찾으십시오. 예를 들어 sysadmins는 평균 이상일 가능성이 높습니다.

103
mattdm

즉, 시작시 ./가 필요한 이유는 Windows와 달리 현재 디렉토리가 기본 경로의 일부가 아니기 때문입니다. 당신이 실행하는 경우 :

$ ls

쉘은 PATH 환경 변수의 디렉토리에서 ls를 찾습니다 (echo $PATH)를 확인하고 찾은 ls이라는 첫 번째 실행 파일을 실행합니다. 입력하면 :

$ a.out

셸도 마찬가지로 작동하지만 a.out이라는 실행 파일을 찾지 못할 수 있습니다. 쉘에 a.out이 어디에 있는지 알려줘야한다. 현재 디렉토리 (.)에 있고 경로는 ./a.out.

왜 "a.out"이라고 부르는지 묻는다면 gcc의 기본 출력 파일 이름 일뿐입니다. -o 명령 행 arg를 사용하여 변경할 수 있습니다. 예를 들면 다음과 같습니다.

$ gcc test.c -o test
$ ./test
45
Simon Whitaker

:.를 $ PATH 변수에 추가하십시오.

Alt + F2를 입력하고 gksudo gedit /etc/environment Linux/GTK를 실행중인 경우 (Ubuntu를 사용하는 경우 보유).

그러나 그렇게하지 말 것을 강력히 권합니다. 나쁜 나쁜 나쁜 나쁜.

1970 년 이후 이런 종류의 것들이 작동한다는 것을 알고 있습니다. 현재 디렉토리가 $ PATH에 포함되지 않는 이유가 있습니다.

.는 현재 디렉토리입니다

.something은 (는) 숨겨진 파일입니다 ( "ALT +"를 입력하여 노틸러스에 표시하거나 "ls -la ".

./someProgram.sh는 현재 디렉토리에서 someProgram.sh 실행 파일을 실행하기 위해 입력 한 것입니다.

.somethingElse은 현재 디렉토리에 숨겨진 실행 파일이 있다는 것을 의미합니다. 이는 나쁜 생각입니다.

4
tiktak