이름만으로 실행 파일을 실행하고 그 앞에 점 / 슬래시를 추가하는 것의 차이점은 무엇입니까?


13

이것은 ls -all명령 의 출력입니다 .

-rwxr----- 1 subhrcho dba  3600 Nov 13 17:26 jdev
-rw-r----- 1 subhrcho dba  1566 Nov 13 17:26 jdev-Darwin.conf
-rw-r----- 1 subhrcho dba   347 Mar  6  2009 jdev-debug.boot
-rw-r----- 1 subhrcho dba   821 Nov 13 17:26 jdev-logging-debug.conf
-rw-r----- 1 subhrcho dba   584 Nov 13 17:26 jdev-logging.conf
-rw-r----- 1 subhrcho dba  4717 Jul 31 16:09 jdev.boot
-rw-r----- 1 subhrcho dba 12877 Nov 13 17:26 jdev.common
-rw-r----- 1 subhrcho dba  5047 Dec  6 01:43 jdev.conf
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdev.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64.exe
-rwxr-x--- 1 subhrcho dba 28672 Nov 13 16:28 jdev64W.exe
-rwxr-x--- 1 subhrcho dba 28160 Nov 13 16:28 jdevW.exe

이제 막 실행했을 때와 같이 실행할 때 jdev와 다른 버전의 Oracle JDveloper를 실행합니다. ./jdev왜 그렇습니까?

답변:


20

다음과 같이 실행 파일 (또는 유닉스 / 리눅스 세계-실행 권한 / 플래그가있는 파일)을 실행할 때 :

$ ./jdev

그런 다음 .이름 jdev이 있고 파일을 시작하는 사용자에 대한 실행 권한이있는 작업 디렉토리 (현재있는 디렉토리) 내에서 파일을 실행하려는 것으로 표시 합니다 (여전히 링크 될 수 있음에 유의해야 함 다른 파일 ls -l jdev은 터미널 에 입력하여 확인할 수 있습니다 )

( linux / unix의 파일 권한 참조 )

당신이 그것을 실행할 때

$ jdev

아마도 jdev시스템 어딘가에 설치되어 있고 $PATH(예 : /usr/bin/또는 /bin/또는 /usr/local/bin/)

으로 peterph가 말했다 : 당신이 사용할 수있는 which특정 명령, 예를 들면 함께 출시되고있는 실행 파일을 가리 키도록하기 위해 :

$ which find
/usr/bin/find

1
또한 which경로가 제공되지 않으면 유틸리티가 어떤 실행 파일을 사용할지 알려줄 수 없습니다.
peterph

@peterph 내 답변을 편집했습니다.
Patryk

7
type특정 명령으로 시작된 것을 확인하는 데 사용 하는 것이 훨씬 좋습니다 . 원인 which은 $ PATH 어딘가에 바이너리 만 표시하지만 절대적으로 다른 바이너리에 별칭이 지정 될 수 있습니다.
돌진

@rush 방금 시도했지만 다음과 같이 작동하지 않습니다 [~] $which zsoelim /usr/bin/zsoelim [~] $ type zsoelim zsoelim is /usr/bin/zsoelim. 동안zsoelim -> soelim
Patryk

2
@Patryk rush는 쉘 별명 / 함수를 의미한다고 생각 which합니다. 실행중인 쉘 환경에 액세스 할 수없는 독립형 바이너리이기 때문에 (환경 변수뿐만 아니라 별명과 함수를 의미합니다) , 일부는 상 속됨).
peterph

8

쉘에서 이름에 슬래시가없는 명령을 호출하면 쉘 별명, 함수 및 $PATH환경 변수에 제공된 경로 목록에서 조회됩니다 . (현재 작업중인 디렉토리 ( .또는 빈 문자열 로 지정 ) 또는에 상대 디렉토리를 $PATH가질 수 있지만 보안상의 이유로 권장되지 않습니다).

이름에 슬래시가있는 경우, 그 이름이 발생하지 않으면 이름은 명령을 실행하는 경로로 사용됩니다 (하지만 zsh별칭이나 함수 와 같은 일부 셸 은 이름에 슬래시가있어 우선 적용됨).

따라서 foo현재 작업 디렉토리에 있는 명령을 실행하려면 슬래시가 포함 된 이름을 사용해야합니다. ./foo가장 분명하다. 전체 경로를 사용하거나 ../dir/foo...

쉘이 무엇을 실행할지 알기 위해서는 type명령을 사용하십시오 . 일반적으로 자신이 생각하는 바를 수행하지 않고 단독으로 사용하는 것이 더 좋은 유산 인 명령사용하지 마십시오whichcsh .


왜 "어느"가 아니라 "타입"입니까?
Geek


올바른 링크를 제공 했습니까?
Geek

이 사이트에서 자주 묻는 질문임을 증명하는 검색 결과입니다. 이러한 질문에 대한 많은 답변이 왜 사용하지 않는지 알려줄 것 which입니다. 예를 들어 unix.stackexchange.com/questions/16693/…
Stéphane Chazelas

2

Zsh의 내장 'where'( 'which'보다 낫다)를 사용하여 $ PATH;-에 대한 별칭, 셸 내장 또는 기타 순서를 찾는 방법과 순서를 확인하는 것이 좋습니다.

다음은 상황을 더 잘 이해하고 선택하는 방법에 대한 예입니다.

[ 0:04:08 ] afsin@s15426859:~ % pwd
/home/afsin
[ 0:04:30 ] afsin@s15426859:~ % which who
/usr/bin/who
[ 0:04:47 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:27 ] afsin@s15426859:~ % echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/bin/X11:/usr/games:/home/afsin/bin
[ 0:05:31 ] afsin@s15426859:~ % touch who
[ 0:05:40 ] afsin@s15426859:~ % chmod +x who
[ 0:05:47 ] afsin@s15426859:~ % ls -al who
-rwxr-xr-x 1 afsin afsin 0 23. Jan 00:05 who
[ 0:05:50 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
[ 0:05:55 ] afsin@s15426859:~ % export PATH=$PATH:.
[ 0:06:09 ] afsin@s15426859:~ % where who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:14 ] afsin@s15426859:~ % alias who=who
[ 0:06:19 ] afsin@s15426859:~ % where who
who: aliased to who
/usr/bin/who
/usr/bin/X11/who
./who
[ 0:06:22 ] afsin@s15426859:~ % which who
who: aliased to who
[ 0:06:27 ] afsin@s15426859:~ %

1

이것은 아마도 쉘에 달려 있지만 일반적으로 규칙은 다음과 같습니다.

  • 상대 경로 또는 절대 경로를 제공하면 해당 경로가 사용됩니다. 현재 디렉토리를 나타 ./jdev내기 때문에 상대 경로입니다 .(실제로 ls -all .와 동일 함 ls -all). 그렇게 /usr/bin/tool/하면 절대 경로를 사용하는 것입니다. 이 경우 지정된 파일이 실행됩니다.

  • 경로를 제공하지 않고 이름 만 제공하면 $PATH실행하려는 도구를 찾기위한 디렉토리 가 검색됩니다.

현재 디렉토리에의 일부 디렉토리에있는 파일과 동일한 이름을 가진 파일 이 있고 이름 $PATH앞에 추가 ./하여 실행하면 다른 파일을 효과적으로 실행할 수 있습니다.

아마도 또 다른 문제는 실제로 jdev현재 디렉토리에서 실행 파일을 실행할 것으로 기대하고 있다는 것 입니다. $PATH를 포함하도록 변경하지 않는 한 ., 이것은 전혀 기대할 수있는 것이 아닙니다 ...

... 그리고 .거기 에 포함시키는 것은 좋지 않은 생각입니다. 그렇다면 적어도 마지막에 넣으십시오. 그래서 나머지 $PATH는 항상 먼저 검색하십시오-공유 네트워크 디렉토리에 있고 누군가는이 악한 바이너리를 넣어하기로 결정 ls하는 경우 $PATH와 시작은 .단순이 ls -lah시스템을 공격하기에 충분합니다.


용어가 혼동됩니다. jdev혼자도 상대 경로입니다. 규칙은 슬래시를 포함하지 않으면 별칭, 함수 및에서 조회되며 $PATH, 그렇지 않으면 파일 시스템에서 직접 조회됩니다 (일부 쉘은 /로 이름이있는 별칭 또는 함수를 허용하지만 우세).
Stéphane Chazelas
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.