쉘은 언제 PATH를 검색합니까?

쉘은 언제 PATH를 검색합니까?

PATH언제 검색해야 할지 좀 헷갈리네요. 나는 PATH간단한 파일 이름이 다음과 같이 줄의 첫 번째 토큰으로 제공되는 경우에만 검색될 것이라고 생각했습니다 .

$ date

그러나 제가 작업 중인 한 가지 문제는 PATH./ 접두사가 있는 파일을 매우 명시적으로 나열할 때 해당 파일도 검색된다는 것을 나타내는 것 같습니다.

$ ./date

이것이 실제로 사실입니까? 즉, 내 작업 디렉토리에실행 가능 파일이름이 붙은 date( date단순한 스크립트라고 가정) 이 질문에 대한 대답은 셸이 검색을 계속할 것임을 나타내는 것 같습니다 PATH(그런 다음 date일부 디렉토리에서 표준 유틸리티를 찾습니다(예: bin).

좀 비슷한 질문을 했는데요여기거기에 대한 답변은 쉘이 검색하는 순서에 대한 좋은 아이디어를 제공합니다. 하지만 명령을 단순한 파일 이름으로 제공한다는 점을 강조합니다. 여기서는 ./ 접두사를 매우 명시적으로 지정했습니다. 쉘이 여전히 검색 중인 이유는 무엇입니까 PATH? 아니면 뭔가 빠졌습니까?


소벨에서Linux 실용 가이드:

다음과 같은 예상치 못한 결과를 설명하십시오.

$ whereis date
date: /bin/date ...
$ echo $PATH 
.:/usr/local/bin:/usr/bin:/bin
$ cat > date
echo "This is my own version of date." 
$ ./date
Sun May 21 11:45:49 PDT 2017

하나는 쉘 스크립트가 ./date실행되어 출력이 다음과 같이 "예상"됩니다."This is my own version of date."

답변1

PATH입력에 슬래시가 포함되어 있으면 POSIX 호환 동작은 변수를 사용하지 않는 것입니다. 예를 들어, 명령이 이면 검색하지만 foo, or 또는 :이면 하나 이상의 슬래시가 있는 항목은 검색하지 않습니다.PATHfoo/bar/foo/bar./foo/bar

셸이 PATH와 같은 기능에 의존하지 않고 자체 코드 기반 내에서 검색 동작을 복제 해야 하는 경우 execvp입력에 슬래시가 포함되어 있으면 검색을 피해야 합니다.

그러나 결과를 쉽게 재현할 수 있습니다.

내 터미널에서 실제 복사하여 붙여넣기:

$ cat > date
echo "this is my own version of date."
$ ./date
Mon 12 Feb 2024 06:38:20 PM PST
$

내가 하고 있는 일은 Ctrl-D해당 echo ...줄 다음에 입력하는 것이 아닙니다. 따라서 $ ./date표준 입력에 입력되는 모든 텍스트가 됩니다 Mon 12 ....cat

답변2

질문에 언급된 연습을 살펴보면, cat표준 밖의 작업을 수행하도록 정의된 함수나 스크립트 cat도 작동할 수 있다고 생각합니다. 나는 책의 온라인 사본을 찾았고 이 연습은 2판, 3판, 4판에 있고 출력의 타임스탬프가 변경되었으므로 오타가 아니라고 생각합니다.

echo "This is my own version of date."세 번째 명령이 입력인지 출력 인지에 따라 다음 cat이 될 수 있습니다.

cat () {
  read; # Reads a line of input, but we won't do anything with it
  echo date; # Write to stdout
  chmod +x /proc/self/fd/1; # Apply execute permissions to stdout's backing file
}

또는:

cat () {
  echo 'echo "This is my own version of date."' >&2 ; # Write to stderr
  echo date; 
  chmod +x /proc/self/fd/1;
}

그 이유는 다음과 같습니다.

  • /proc/self/fd/1stdout이 파일로 리디렉션되는 경우 이는 실제 파일에 대한 심볼릭 링크입니다.
  • chmod인자로 심볼릭 링크가 주어지면 가리키는 파일에 대한 권한을 변경한다.

Red Hat 4.2(1997년에 출시됨) 맨페이지를 확인했는데 그때도(proc(5),chmod(1)), 따라서 이 기능은 이 책의 첫 번째 버전으로 돌아가더라도 계속 작동합니다. (물론 가짜 cat도 직접 찾아볼 수 있습니다.)chmod +x ./date

관련 정보