다음은 명령의 출력입니다 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
다른 버전이 실행됩니다.오라클 JDveloper실행했을 때보다 ./jdev
... 왜 이런 일이 발생하는 걸까요?
답변1
실행 파일(또는 unix/linux 세계에서는 실행 권한/플래그가 있는 파일)을 다음과 같이 실행할 때:
$ ./jdev
.
그런 다음 이름이 지정되고 파일을 시작한 사용자에 대한 실행 권한이 있는 작업 디렉터리(현재 있는 디렉터리) 내에서 파일을 실행하도록 표시합니다 jdev
(여전히 다른 파일에 대한 링크일 수 있다는 점에 유의해야 합니다). ls -l jdev
터미널에 입력하여 확인 가능 )
( 바라보다Linux/unix에서의 파일 권한)
당신이 그것을 실행할 때
$ jdev
그렇다면 jdev
시스템 어딘가에 설치되어 있을 가능성이 높으며 $PATH
(예: /usr/bin/
또는 /bin/
또는 /usr/local/bin/
) 에 설치했습니다.
~처럼페테브명령문: which
to를 사용하여 특정 명령으로 실행되는 실행 파일을 가리킬 수 있습니다. 예를 들면 다음과 같습니다.
$ which find
/usr/bin/find
답변2
이름에 슬래시 없이 명령을 쉘에서 호출하면 환경 변수에 제공된 쉘 별칭, 함수 및 경로 목록에서 명령이 검색됩니다 $PATH
. (현재 작업 디렉터리( .
또는 빈 문자열로 지정) 또는 상대 디렉터리를 포함할 수 있지만 $PATH
보안상의 이유로 권장되지 않습니다.)
이름에 슬래시가 있는 경우에는 이런 일이 발생하지 않으며 이름은 명령을 실행하기 위한 경로로 처리됩니다(일부 쉘에서는 zsh
별칭이나 함수의 이름에 슬래시가 우선 적용되도록 허용하지만).
따라서 현재 작업 디렉터리에서 that이라는 명령을 실행하려면 foo
슬래시가 포함된 이름을 제공해야 합니다. ./foo
가장 분명합니다. 전체 경로를 사용할 수도 있습니다. 또는 ../dir/foo
...
쉘이 실행될 내용을 찾으려면 type
명령을 사용하십시오.which
이 명령을 사용하지 마십시오일반적으로 그것은 당신이 생각하는 대로 이루어지지 않으며, csh
그대로 놔두는 것이 가장 좋은 유산입니다.
답변3
$PATH에 대해 별칭, 쉘 내장 또는 기타 항목이 어떻게, 어떤 순서로 발견되는지 확인하려면 Zsh에 내장된 "where"("which"보다 좋음)를 사용하는 것이 좋습니다 ;-)
다음은 사물과 선택 방법을 더 잘 이해하기 위한 예입니다.
[ 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:~ %
답변4
이는 쉘에 따라 다를 수 있지만 일반적으로 규칙은 다음과 같습니다.
상대 또는 절대 경로를 제공하면 해당 경로가 사용됩니다. 는 현재 디렉터리를 나타내는
./jdev
상대 경로입니다.
(실제로는ls -all .
동일한 를 제공합니다ls -all
). 이렇게 하면/usr/bin/tool/
절대 경로를 사용하게 됩니다. 이러한 경우에는 지정된 파일이 실행됩니다.경로는 제공하지 않고 이름만 제공하는 경우 디렉터리에서
$PATH
실행하려는 도구를 검색합니다.
현재 디렉터리에 일부 디렉터리의 파일과 동일한 이름을 가진 파일이 있고 $PATH
이름 앞에 접두사를 붙여 실행하면 ./
다른 파일이 효과적으로 실행됩니다.
jdev
어쩌면 또 다른 문제는 실제로 현재 디렉터리에서 실행 파일을 실행 하려는 것입니다 . $PATH
include 로 변경하지 않는 한 .
, 이는 전혀 기대할 수 없는 것입니다...
...그리고 그것을 거기에 포함시키는 것은 여전히 좋은 생각이 아닙니다. .
그렇게 한다면 적어도 $PATH
나머지가 항상 먼저 검색되도록 마지막에 두십시오. 공유 네트워크 디렉토리에 있고 누군가가 거기에 하나를 넣기로 결정했다고 상상해 보십시오. 바이너리 로 시작하는 경우 간단한 바이너리 만으로도 시스템을 공격하기에 충분하기 ls
때문입니다 .$PATH
.
ls -lah