Каков порядок вывода какой команды?

Каков порядок вывода какой команды?

В bash я вижу whichвозврат путей по порядку, но в zsh порядок другой.

Я сейчас в основном использую zsh, как мне получить правильный порядок вывода whichв 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при передаче -aпараметра. С помощью zshвстроенных функций вы можете сделать то же самое с помощью whence -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и .zshwhich


¹ хотя, как и ваш /usr/bin/which(но в отличие от встроенного zsh which), он не обязательно скажет вам, какую команду будет выполнять оболочка, поскольку он игнорирует псевдонимы, функции, встроенные функции и даже таблицу $hashисполняемых файлов. Смотрите такжеПочему бы не использовать "which"? Что тогда использовать?

Связанный контент