이 사이트에서 POSIX 쉘 표준에 따르면
http://pubs.opengroup.org/onlinepubs/9699919799/
쉘 PATH
이 실행 파일을 찾는 데 사용하는 방법에 대한 :
"지정된 이름과 적절한 실행 권한을 가진 실행 파일이 발견 될 때까지 각 접두사에 파일 이름을 적용하여 목록을 처음부터 끝까지 검색해야합니다."
글쎄, 이것은 이것이 실제 POSIX 구현에서 작동하는 것처럼 보이지 않습니다 :
man which
말한다 :
"현재 환경에서 실행될 파일 (또는 링크)의 경로 이름을 반환합니다. 인수는 엄격하게 POSIX 호환 쉘에서 명령으로 제공되었습니다. 이는 PATH에서 "심볼 링크를 따르지 않습니다."
좋아,이 상황을 보자.
$ pwd
/home/mark
$ echo $PATH
/home/mark/bin:
...
$ ls -l bin/foobar
lrwxrwxrwx 1 mark mark 18 Dec 12 22:51 bin/foobar -> /home/mark/foobar1
$ touch foobar1
$ which foobar
$ chmod a+x foobar1
$ which foobar
/home/mark/bin/foobar
여기 PATH
, 올바른 이름 의 심볼릭 링크 ls
가 있으며 실행 가능 하다고보고되었습니다 .
which
전혀 보지 않고 단지 그것이 지적하는 것에 관심이 있습니다.
그럼에도 불구하고 man which
명시 적으로 심볼릭 링크를 따르지 않는다는 사실에도 불구하고 (실제로 which foobar
인쇄하지 않기 때문에 그렇지 않다는 foobar1
것을 알았습니다) 위에서 언급 한 POSIX 셸 설명서는 결코 PATH
알고리즘 에서 심볼릭 링크를 따르는 것을 언급하지 않습니다 .
그렇다면 which
기존 쉘이 잘못되었거나 설명서를 이해하지 못합니까?
명확하게 :
기존의 행동을 알고 설명 할 수 있습니다. 내 질문은 "어떻게 작동합니까?"가 아닙니다. 내가 알아
내 질문은 문서에 관한 것입니다 : 내가 인용 한 문서를 따르는 데 실수가 있습니다. 아니면 설명서가 잘못 되었습니까?
동기 부여 : 왜 신경 쓰나요?
글쎄, 나는 구현 자이다. 구현 자마다 요구 사항이 다릅니다. 나를 위해, 현재 POSIX 표준의 단어를 정확히 따라야합니다 (또는 표준 자체가 다소 버그가 있기 때문에 더 정확하게 할 수 있어야합니다). 마치 하나님의 말씀처럼.
이제 표준 문구는 매우 분명합니다. 다음 심볼릭 링크는 언급되지 않았습니다. 다른 곳에서는 수행해야 할 위치가 언급되어 있습니다. 따라서이 경우에는하지 마십시오.
그러나 나는 항상 확인 하기 위해 방법 dash
과 bash
행동을 다시 확인합니다 . 물론 dash
POSIX로 청구되었지만 POSIX에 부합하는 작은 버그가 많이 있습니다. bash
POSIX와 관련된 버그는 아직 찾지 못했지만 bash는 실제로 POSIX가 아니며 그 이상입니다.
그래서 당신은 그것을 가지고 있습니다. 그게 내가 걱정하는 이유입니다.
$PATH
에는 심볼릭 링크가 없습니다.
lstat(2)
:). 예를 들어에 대한 설명 open(2)
은의 동작에 대해 말할 때 심볼릭 링크 만 언급합니다 O_CREAT | O_EXCL
. 대상 파일이 열릴 것이라고 언급 할 필요는 없습니다.
$PATH
심볼릭 링크를 포함 할 수 있습니다. 시도하십시오which sh
.