디렉토리만 실행할 때 PATH가 bash와 csh에서 다르게 동작합니까?

디렉토리만 실행할 때 PATH가 bash와 csh에서 다르게 동작합니까?

우리는 유닉스 그룹에 대한 액세스를 제한하는 다양한 하위 디렉터리에 일부 응용 프로그램을 가지고 있으며 실행만 하길 원합니다. 예를 들어, "chem" 그룹의 구성원이 a.out에 대한 실행 전용 액세스 권한을 가지도록 하려면 다음을 수행할 수 있습니다.

$ ll -d /tmp/dir1
drwx--x--- 2 root chem 18 Oct 20 07:50 /tmp/dir1/
$ ll /tmp/dir1/a.out 
-rwx--x--- 1 root chem 8728 Oct 20 07:50 /tmp/dir1/a.out

이제 나("chem" 그룹의 구성원)는 bash 셸에서 내 경로에 이 디렉터리를 추가하고 a.out을 실행할 수 있습니다.

$ export PATH=/tmp/dir1:$PATH
$ a.out
 This is a test. . .

그러나 tcsh에서는 다음을 수행할 수 없습니다.

$ set path = ( /tmp/dir1 $path )
$ a.out
a.out: Command not found.

tcsh 사용자가 a.out을 실행할 수 있도록 상위 디렉토리에 그룹 읽기 권한을 추가해야 했습니다(bash는 두 경우 모두 작동했습니다).

$ ll -d /tmp/dir1
drwxr-x--- 2 root chem 18 Oct 20 07:50 /tmp/dir1/

chmod 후에 로그아웃했다가 다시 로그인한 후(tcsh 아래) 다음을 수행합니다.

$ set path = ( /tmp/dir1 $path )
$ a.out
 This is a test. . .

상위 디렉터리에 대한 읽기 권한은 필요하지 않을 것으로 예상됩니다. 이 경우 bash와 tcsh 사이의 명백한 동작 차이를 설명하기 위해 모든 문서를 살펴봤지만 운이 없었습니다. 누구든지 이것을 설명할 수 있나요? 그런데 SLES 12와 CentOS 7에서 이 테스트를 실행했는데 두 경우 모두 동작이 동일했습니다.

답변1

bash명령이 실행될 때마다 $PATH의 각 디렉터리(처음부터 마지막까지)가 검색되고 해당 디렉터리에서 명령을 실행하려고 시도됩니다. 성공하거나 실패하거나 둘 중 하나입니다. 따라서 /tmp/dir1$PATH에 있고 a.out해당 디렉토리에 있으면 실행을 시도할 수 있습니다 a.out. 실행 권한이 있으므로 bash실행을 시도 /tmp/dir1/a.out하고 성공할 것입니다.

csh은 다르다. 변경(또는 설정)하면 경로의 모든 디렉터리에 있는 모든 항목의 해시 $path테이블 csh이 작성되고 해당 디렉터리가 경로에 나타나는 순서를 기억합니다. 기본적으로 전체 경로 이름을 사용하지 않고 명령을 실행하면 csh해당 명령이 경로 어딘가에 있다는 것을 기억하는지 확인하기 위해 해시 테이블을 찾습니다(경로에 여러 디렉터리가 있는 경우 해당 경로를 선택합니다). 에 나열된 순서대로 찾은 첫 번째 항목입니다 $path. 해시 테이블에서 찾지 못하면 해당 명령이 존재하지 않는다고 가정하고 오류가 발생합니다. 이는 오래 전에 시간이 걸렸을 때 유용했습니다. 경로의 모든 디렉토리를 검색하고 명령을 찾는 것은 더 이상 그다지 중요하지 않지만 csh항상 그랬고 오늘날에도 마찬가지입니다.

csh해시 테이블을 구축 하려면 $path어떤 실행 파일이 있는지 정확히 알 수 있어야 합니다 $path. 읽기 권한이 거부되었기 때문에 /tmp/dir1해시 csh테이블을 구축할 수 없으며 실행 파일에 명령이 없는 것으로 처리됩니다. 디렉토리가 전혀 없습니다. 그렇기 때문에 읽기 권한이 없으면 디렉토리에서 csh파일을 찾을 수 없습니다 .a.out$path

csh읽기 권한이 없는 $path 디렉터리에서 명령을 찾으 려면 해시 기능을 꺼야 합니다. 내장된 명령을 실행하여 이를 수행할 수 있습니다 unhash. 일단 실행하면 해시 테이블 기능이 꺼지고 csh검색 경로의 모든 디렉터리를 시도하여 검색 경로에서와 마찬가지로 명령을 실행할 수 있는지 확인하게 됩니다 bash.

csh이 해싱 동작의 또 다른 부작용은 실행 파일을 검색 경로의 디렉터리 에 추가하는지 csh알 수 없다는 것 입니다. 따라서 emacs( /usr/local/bin검색 경로에 있음)을 입력한다고 가정해 보겠습니다 . 그런 다음 실행을 시도했지만 emacs... 명령을 찾을 수 없습니다. 이 문제를 해결하려면(해싱을 끄지 않고) 새로운 해시 테이블 세트를 구축하라는 rehash명령을 실행 csh하면 추가된 새 콘텐츠를 모두 선택하게 됩니다.

관련 정보