어떤 명령에 출력 순서가 있나요? [폐쇄]

어떤 명령에 출력 순서가 있나요? [폐쇄]

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.

귀하의 명령은 options 을 전달할 때 발견된 모든 명령 이름의 경로를 /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없으므로 출력은 쉘 독립적입니다. 오직 내장된 것들이 있습니다 .whichwhichtcshzshwhich


1 그러나 귀하의 것과 마찬가지로 /usr/bin/which(zsh의 내장과 달리 ) 별칭, 함수, 내장 및 실행 가능 테이블 which까지 무시하기 때문에 쉘이 실행할 명령을 반드시 알려주지는 않습니다 . $hash당신은 또한 볼 수 있습니다" which "를 사용하지 않는 이유는 무엇입니까? 그러면 무엇을 사용해야 합니까?

관련 정보