어떤 명령 출력 순서가 무엇입니까?

어떤 명령 출력 순서가 무엇입니까?

Bash에서는 which경로가 순서대로 반환되는 것을 볼 수 있지만 zsh에서는 순서가 다릅니다.

which저는 이제 주로 zsh를 사용합니다. zsh에서 적절한 출력 순서를 얻으려면 어떻게 해야 합니까 ? 왜 다른가요? 나는 그 순서가 내 길과 일치할 것이라고 기대했다.

내 경로는 다음과 같습니다/usr/local/bin:/usr/bin

bash$ which -a git
/usr/local/bin/git
/usr/bin/git
zsh$ which -a git
/usr/bin/git
/usr/local/bin/git -> ../Cellar/git/2.32.0/bin/git

답변1

당신은 다음과 같이 정의했습니다 which.

which(){
  /usr/bin/which -a "$@" |
    xargs ls -l |
    tr -s ' ' |
    cut -d ' ' -f 9-
}

ls출력 시 파일 이름을 어휘적으로 정렬하고 그 뒤에 옵니다 ./usr/local/bin/git/usr/bin/gitl뒤에 온다b귀하의 지역에서.

GNU 구현에는 해당 정렬을 비활성화하는 옵션이 ls있습니다 .-U

귀하의 명령은 옵션 을 전달할 때 /usr/bin/which발견된 모든 명령 이름의 경로를 인쇄하는 명령인 것 같습니다 . 내장 기능을 사용하면 ¹ 에서도 동일한 작업을 수행할 수 있습니다 .$PATH-azshwhence -pa

따라서 다음과 같이 할 수 있습니다.

mywhich() (
  set -o pipefail
  zmodload zsh/stat
  whence -pa "$@" |
    while IFS= read -r f; do
      if [[ -L $f ]] && stat -A l +link -- $f; then
        print -r -- "$f -> $l"
      else
        print -r -- $f
      fi
    done
)

(여기에서는 파일 경로에 개행 문자가 포함되어 있지 않다고 가정합니다).

GNU 시스템에서 더 정확한 버전은 다음과 같습니다:

mywhich() (
  set -o pipefail
  command which -a "$@" |
    xargs -rd '\n' ls -ndU -- |
    sed -E 's/([^ ]+ +){8}//'
)

어쨌든 내장 기능이 bash없으므로 출력되는 which내용은 which셸과 무관합니다. 오직 내장 tcsh되어 zsh있습니다 which.


¹ 하지만 /usr/bin/whichzsh의 내장과 달리 which별칭, 함수, 내장 및 심지어는 셸이 실행할 명령을 반드시 알려주지는 않습니다.$hash 별칭, 함수, 내장 및 실행 파일 테이블 . 또한보십시오" which "를 사용하지 않는 이유는 무엇입니까? 그러면 무엇을 사용해야 할까요?

관련 정보