“./”를 사용하여 파일을 실행하는 이유는 무엇입니까?


84

./filenameLinux에서 파일을 실행하는 데 왜 사용 합니까?

이유는 단지 다른 명령처럼 입력하지 gcc, ls등 ...


첫 번째 줄을 " Linux ./command_name에서 명령 을 실행하는 데 왜 사용 합니까?"

답변:


78

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

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


5
현재 디렉토리에서 프로그램을 실행하는 것이 매우 일반적입니다. 왜 쉘이 검색하지 않습니까? 먼저.에서 검색 한 다음 $ PATH에서 검색합니다.
Michael

도 있습니다 alias, 방법으로 단지를 얻을 수 있습니다 말이지 $PATH.
user2485710

18
@Michael 보안 및 정신 : 그것은에서 검색하면 .먼저이 보안 문제가 될 것입니다, 당신 또는 대체 할 수있는 다른 사람 ls(예를 들어, 간단한 바이러스 / trojen :라는 이름의 실행 파일과 압축 파일 만들기 ls누군가를 검색 한, 그것에을 , 그들은이 실행 파일을 실행합니다 ...). 그것에서 검색하면 .마지막으로 당신은 (대신이 시스템 테스트 프로그램을 실행 프로그램을 실행하는, 예를 들어, 당신은 테스트라는 프로그램을합니다. 더 출력을 생성하지 않는) 프로그램이 작동하지 않는 이유 미친 모르고가는 긴 시간을 보낼 수 있습니다.
ctrl-alt-delor

또한 응용 프로그램이나 스크립트가 경로에 여러 번 나타날 경우 실행하려는 버전 ( "."디렉토리에있는 버전)을 실행하고 있는지 확인합니다.
Jim2B

export PATH="$PATH:."PATH의 다른 곳에서 찾을 수없는 경우 현재 디렉토리에서 명령을 실행 하도록 실행할 수 있습니다. .bashrc 파일에 추가 할 수 있습니다.
jcubic

99

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

그런데 왜? 간단히 말해, 보안을위한 것입니다. 다른 사람의 홈 디렉토리 (또는 / tmp)를 찾고 just gcc또는을 입력 ls하는 경우, 장난 꾸러기 친구가 작성한 악성 버전이 아니라 실제 파일을 실행하고 있다는 것을 알고 싶어합니다. 모든 파일이 지워집니다. 또 다른 예는 것 test또는 [쉘 내장 기능으로 사람들이없는 경우, 쉘 스크립트에서 이러한 명령을 무시할 수있는.

갖는 .는 AS 마지막 경로에 진입하는 것은 조금 더 안전하지만, 그 사용을 다른 공격이있다. 쉬운 방법은 sl또는 과 같은 일반적인 오타를 이용하는 것 ls-l입니다. 또는이 시스템에 설치되지 않은 일반적인 명령을 찾으십시오. vim예를 들어 sysadmins는 평균 이상의 입력 가능성을 가지고 있기 때문입니다.


5
누군가가 이것에 조금 익숙해지는 실제적인 예 : unix.stackexchange.com/questions/7767
mattdm

PATH환경 변수 에 절대 경로가 있습니다.
Ed Heal

45

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

$ ls

쉘은 lsPATH 환경 변수의 디렉토리에서 찾아보고 찾은 echo $PATH첫 번째 실행 파일을 실행합니다 ls. 입력하면 :

$ a.out

쉘도 마찬가지입니다. 그러나 아마도 a.out이라는 실행 파일을 찾지 못할 것입니다. 쉘에 a.out이 어디에 있는지 알려줘야한다. 그것은 현재 디렉토리 (.)에 있고 경로는이다 ./a.out.

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

$ gcc test.c -o test
$ ./test

고마워. 내 의심은 왜 시작에 ./가 필요한지 .. 나는 "." (현재 디렉토리를 poit하기 위해) 왜 그 후에 "/"?
Renjith G

8
/는 Linux에서 경로 구분 기호이므로 디렉토리 (.)를 파일 이름 (a.out)과 구분하는 데 사용합니다. 그것 없이는 .a.out이 있으며 그 자체로는 유효한 파일 이름입니다. touch .a.out; ls -lA
Simon Whitaker 8:30에

5
이것이 유닉스에서 경로를 지정하는 방법입니다. <dir>/<file>따라서 기본적으로 현재 디렉토리에서 파일을 실행한다고합니다../test
Rohan Monga

i686의 Red Hat Linux 릴리스 9 (Shrike) 커널 2.4.20-8 [renjithg @ cvsserver renjithg] $ touch .a.out; ls -l 총 3 -rw-rw-r-- 1 renjithg renjithg 0 11 월 30 13 : 46 .a.out -rwxrwxr-x 1 renjithg renjithg 11669 11 월 30 일 13:46 a.out -rw-rw-r-- 1 renjithg renjithg 2009 년 8 월 24 일 aray.c [renjithg @ cvsserver renjithg] $
Renjith G

3
Red Hat Linux 9? 업그레이드 시간!
mattdm

4

:.$ PATH 변수 에 추가 할 수 있습니다 .

gksudo gedit /etc/environmentLinux / GTK를 실행하는 경우 ALT + F2를 입력하고 다음을 입력하십시오 (Ubuntu를 사용하는 경우 사용함).

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

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

. 현재 디렉토리입니다

.something숨김 파일 ( "ALT +"를 입력하여 노틸러스에 표시하거나 " ls -la"을 시도하십시오 .

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.